xop+xml 和 soap+xml 之间的 WCF 类型不匹配

Posted

技术标签:

【中文标题】xop+xml 和 soap+xml 之间的 WCF 类型不匹配【英文标题】:WCF type mismatch between xop+xml and soap+xml 【发布时间】:2020-01-22 21:34:44 【问题描述】:

我正在尝试连接到描述为 .wsdl 文件的第三方服务。我无法提供整个文件,因为它太长了,但重要的部分是:

<wsdl:port name="ec2HttpSoap12Endpoint" binding="tns:ec2Soap12Binding">
  <soap12:address location="<service url>.ec2HttpSoap12Endpoint/"/>
</wsdl:port>

<wsdl:binding name="ec2Soap12Binding" type="tns:ec2PortType">
<soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
  <wsdl:operation name="someOperation">
    <soap12:operation soapAction="urn:someOperation" style="document"/>
    <wsdl:input>
      <soap12:body use="literal"/>
    </wsdl:input>
    <wsdl:output>
      <soap12:body use="literal"/>
    </wsdl:output>
  </wsdl:operation>
  ...
</wsdl:binding>

我的代码很简单:

ec2PortTypeClient client = new ec2PortTypeClient("ec2HttpSoap12Endpoint", "<service url>");
var response = ePortConnect.someOperation(...).Result.@return;

但我得到一个例外:

ProtocolException:内容类型multipart/related;边界="MIMEBoundary_f9ac1ac9023b2de2dbb6e3f07d0952ff0bbdfdd7433cd9ec";类型=“应用程序/xop+xml”;开始="";开始信息=“应用程序/soap+xml”;响应消息的 action="urn:someOperation" 与绑定的内容类型不匹配(application/soap+xml; charset=utf-8)。 ... 响应的前 1024 个字节是:

然后来自服务器的完全正常的响应!

看起来定义正常,但是响应类型应该设置为XOP,否则我的C#代码有误。服务器正常响应,但由于类型不匹配,未解析响应。我做错了什么?

供应商声称 .wsdl 是正确的,我相信他们。但是我的两行代码可能有什么问题?

Link 到一个完整的 .wsdl 文件。

【问题讨论】:

看看这个ibm.com/support/knowledgecenter/en/SSGMCP_5.3.0/…(什么是xop+xml的基本描述),这个en.wikipedia.org/wiki/XML-binary_Optimized_Packaging(更多关于xop+xml),这个***.com/questions/10496186/…(可能的解决方案在那里)还有这个github.com/dotnet/wcf/issues/2919(另一个可能类似的问题) 【参考方案1】:

尝试使用Mtom 而不是文本来编码 SOAP 消息。

Config: <binding messageEncoding="Mtom"> Code: binding.MessageEncoding = WSMessageEncoding.Mtom;

【讨论】:

以上是关于xop+xml 和 soap+xml 之间的 WCF 类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章

webservice有关application/xop+xml的异常

XML Over HTTP 和 SOAP Over HTTP 之间的区别

XSLT转换需要添加SOAP信封并在SOAP标头和正文之间拆分XML

在 Swift 中解析多部分 SOAP 响应

在 WebSphere SOAP XOP 中,附件引用被替换为附件 base64 值

我想写一个sql查询来获取soap xml中两个标签之间的数据,这些标签出现在oracle表的clob列中