Tôi đang viết một ứng dụng trong Delphi 2007 tiêu thụ một dịch vụ web. Tôi đã sử dụng trình nhập WSDL để tạo mã cần thiết để giao tiếp với dịch vụ, nhưng tôi nhận được lỗi "không mong muốn subelement (elementname)" khi cố gắng sử dụng dịch vụ.Delphi 2007 tạo các thông báo SOAP không chính xác
Sử dụng Fiddler 2, tôi đã phát hiện ra rằng vấn đề là một xmlns đã được thêm vào một mảng các giá trị được gửi trong thông điệp SOAP:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="..." xmlns:xsd="..." xmlns:xsi="...">
<SOAP-ENV:Body>
<Request xmlns="http://service.com/theService/">
<UserName xmlns="">user</UserName>
<Password xmlns="">pass</Password>
<List xmlns="">
<Item xmlns="http://service.com/theService/">123456</Item>
<Item xmlns="http://service.com/theService/">84547</Item>
</List>
</Request>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Nếu tôi gửi lại thông điệp được tạo ra bởi Delphi trong Fiddler , thay đổi xmlns cho các phần tử Item thành một chuỗi rỗng, tôi không còn gặp lỗi nữa và dịch vụ đáp ứng đúng cách. ví dụ:
<List xmlns="">
<Item xmlns="">123456</Item>
<Item xmlns="">84547</Item>
</List>
Bây giờ, tôi có thể thoát khỏi những tính xmlns cho các hạng mục danh sách bằng cách thay đổi một phần của khởi của lớp dịch vụ của tôi từ:
InvRegistry.RegisterInvokeOptions(TypeInfo(ServicePort), ioDocument);
InvRegistry.RegisterInvokeOptions(TypeInfo(ServicePort), ioLiteral);
RemClassRegistry.RegisterSerializeOptions(RequestType, [xoLiteralParam]);
tới:
InvRegistry.RegisterInvokeOptions(TypeInfo(ServicePort), ioDocument);
RemClassRegistry.RegisterSerializeOptions(RequestType, [xoHolderClass, xoLiteralParam]);
Tuy nhiên, điều này sau đó sẽ làm cho tên thành phần Yêu cầu được thay đổi thành tên của hành động SOAP mặc định (ví dụ: GetInformation), một lần nữa sẽ gây ra lỗi. Tôi đã đấu tranh với điều này quá lâu, mọi ý tưởng sẽ được đánh giá cao.
Ngoài ra, tôi đã tạo một ứng dụng C# thử nghiệm sử dụng dịch vụ và không có bất kỳ sự cố nào khi giao tiếp với dịch vụ.
Tôi cũng đã kết thúc việc thay đổi gói SOAP, nhưng trong trường hợp của tôi cho một danh sách trả về. – mj2008