2010-01-19 35 views
6

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ụ.

Trả lời

6

Tôi đã nói chuyện với những người khác có vấn đề tương tự với serialization ở Delphi, và có vẻ như không có cách nào rõ ràng để khắc phục vấn đề này. Thay vào đó, giải pháp tôi đã sử dụng là đính kèm một trình xử lý sự kiện vào sự kiện OnBeforeExecute của đối tượng THTTPRIO gửi thông báo SOAP, cho phép bạn truy cập vào thông điệp xà phòng được tuần tự hóa dưới dạng một chuỗi. Từ đó tôi chỉ phân tích cú pháp thuộc tính gây ra vấn đề, và bây giờ mọi thứ hoạt động.

Một chút của một giải pháp xấu xí, nhưng nó hoạt động.

+0

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

Các vấn đề liên quan