gpt4 book ai didi

将 WSDL 中定义的响应反序列化为空消息时,WCF 使用 SOAP 会出错

转载 作者:行者123 更新时间:2023-12-05 09:23:39 24 4
gpt4 key购买 nike

我对 WCF 和相关技术还很陌生。 (顺便说一句,使用 WCF 4.0。)

以下是我需要与之交互的 Web 服务的 WSDL 文件的一些片段。

  <wsdl:binding name="MPGWCSTAOperations_v1_1SoapBinding" type="impl:MPGWCSTAOperations">
<wsdlsoap:binding transport="http://schemas.xmlsoap.org/soap/http" />
...
<wsdl:operation name="MonitorStartLine">
<wsdlsoap:operation soapAction="urn:v1_1.csta.ws.mpgw.gintel.com/MonitorStart" />
<wsdl:input name="MonitorStartLineRequest">
<wsdlsoap:body use="literal" />
</wsdl:input>
<wsdl:output name="MonitorStartLineResponse">
<wsdlsoap:body use="literal" />
</wsdl:output>
</wsdl:operation>
...
</wsdl:binding>

<wsdl:portType name="MPGWCSTAOperations">
...
<wsdl:operation name="MonitorStartLine" parameterOrder="monitorStartLine">
<wsdl:input name="MonitorStartLineRequest" message="impl:MonitorStartLineRequest" />
<wsdl:output name="MonitorStartLineResponse" message="impl:MonitorStartLineResponse" />
</wsdl:operation>
....
</wsdl:portType>

<wsdl:message name="MonitorStartLineResponse" />

我的理解是定义了MonitorStartLine操作返回响应消息MonitorStartLineResponse,定义为空消息。

我使用 Visual Studio 的项目 - 添加服务引用工具为此生成 C# 代理代码。

然后我做这样的事情:

   MPGWCSTAOperationsClient cstaOperationsClient = new MPGWCSTAOperationsClient();

MonitorStartLine monitorStartLine = new MonitorStartLine();
monitorStartLine.pnis = new string[] {"0000032"};

cstaOperationsClient.MonitorStartLine(monitorStartLine);

这会导致以下异常:

System.ServiceModel.CommunicationException was unhandled
HResult=-2146233087
Message=Error in deserializing body of reply message for operation 'MonitorStartLine'.
End element 'Body' from namespace 'http://schemas.xmlsoap.org/soap/envelope/' expected.
Found element 'monitorStartLineResponse' from namespace 'urn:v1_1.csta.ws.mpgw.gintel.com'. Line 1, position 296.
Source=mscorlib

使用 Fiddler 我看到的响应如下:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
X-Powered-By: Servlet 2.5; JBoss-5.0/JBossWeb-2.1
Content-Type: text/xml;charset=utf-8
Transfer-Encoding: chunked
Date: Wed, 16 Oct 2013 22:01:44 GMT

149
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<monitorStartLineResponse xmlns="urn:v1_1.csta.ws.mpgw.gintel.com"/>
</soapenv:Body>
</soapenv:Envelope>

在我看来它符合 WSDL。

我想我可以忽略这个错误(服务器永远不会更聪明),但如果可能的话我更愿意解决这个问题。

最佳答案

该消息符合 WSDL,但在 WSDL 规范不明确的地方。 .NET 在 Body 元素中不期望任何内容,因为没有定义任何消息部分。发件人正在发送一个空的 monitorStartLineResponse 元素,就像指定了一个消息部分一样,其中包含一个名为 monitorStartLineResponse 的元素。

由于 WSDL 规范不明确的区域,Web Services Interoperability Organization成立。 WS-I Basic Profile 1.1规范的开发是为了指定 WSDL 的一个子集,保证可以跨平台互操作。

此 WSDL 不符合 WS-I BP 1.1。


事实上,从阅读 WSDL 1.1 spec ( section 3.4, soap:operation ),我看到这将被视为“文档-文字绑定(bind)”,因为没有“样式”属性另有说明。

4.4.1, Bindings and Parts部分,R2213,WS-I BP 1.1 规范说:

R2213 In a doc-literal description where the value of the parts attribute of soapbind:body is an empty string, the corresponding ENVELOPE MUST have no element content in the soap:Body element.

这是 .NET 所期望的,但不是 .NET 所接收的。

关于将 WSDL 中定义的响应反序列化为空消息时,WCF 使用 SOAP 会出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19416826/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com