带有不在XSD中的响应元素的WS服务
我们使用.NET 4.x WCF来使用JAX-WS服务。 通过“添加服务引用”从WSDL和XSD生成的代理生成可正确调用服务的代码。 但是,服务响应使用的是未在XSD中定义的根元素名称。 代理返回空结果,大概是因为元素名称未被识别,所以其余的响应信封被忽略。
SOAP响应看起来像这样。 注意正文中的根元素名为txLife22814Type
:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" />
<soapenv:Body>
<ns3:txLife22814Type xmlns:ns3="http://ACORD.org/Standards/Life/2" xmlns:ns2="http://dtcc.com/lnapm/service/">
<ns3:TXLife>
...snip...
</ns3:TXLife>
</ns3:txLife22814Type>
</soapenv:Body>
</soapenv:Envelope>
XSD的相关部分如下所示。 注意根元素命名为Tx22814
并没有txLife22814Type
与相关TXLife_22814_Type
复杂类型:
<xs:schema xmlns="http://ACORD.org/Standards/Life/2" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://ACORD.org/Standards/Life/2" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="Tx22814" type="TXLife_22814_Type"/>
<xs:element name="Tx22815" type="TXLife_22815_Type"/>
<xs:element name="Tx22816" type="TXLife_22816_Type"/>
<xs:complexType name="TXLife_22814_Type">
<xs:sequence>
<xs:element name="TXLife" type="TXLife_IPT_Type"/>
</xs:sequence>
</xs:complexType>
其余的响应与XSD相匹配。 (我没有发布完整的WSDL和XSD,因为它们相当大,有数百行。)
在发送端,操作请求采用相同类型( TXLife_22814_Type
)作为输入参数(实际上它是由服务修改的byref),调用的WSDL引用正确的XSD名称( Tx22814
),并且它可以工作。
我试图添加第二个根到映射到相同类型的XSD:
<xs:element name="txLife22814Type" type="TXLife_22814_Type"/>
这导致请求失败,这让我感到吃惊。 我想知道WCF是否不能消除这种类型的歧义,尽管我期望在WSDL中明确使用Tx22814
名称应该能够解决这个问题。 WSDL(为了可读性而大量编辑以仅显示相关操作)看起来像这样。 这里感兴趣的操作或“消息”是isProducerTrainedRequest
:
<wsdl:definitions ...snip... >
<wsdl:types>
<xsd:schema targetNamespace="http://dtcc.com/lnapm/service/">
<xsd:import namespace="http://ACORD.org/Standards/Life/2" schemaLocation="DTCC_PM_ACCORD_V2.28.xsd"/>
<xsd:element name="MessageHeader">
... snip ...
</xsd:element>
</xsd:schema>
</wsdl:types>
<wsdl:message name="isProducerTrainedRequest">
<wsdl:part element="ns1:Tx22814" name="Tx22814"/>
</wsdl:message>
<wsdl:message name="isProducerTrainedResponse">
<wsdl:part element="ns1:Tx22814" name="Tx22814Response"/>
</wsdl:message>
我编写了一个AfterReceiveReply拦截器,并在损坏的标签上进行了字符串替换,然后代理的其余部分工作,但这显然是我们希望避开生产代码的黑客。
我们不拥有这项服务。 服务提供商没有其他.NET消费者。 他们声称所有基于Java的客户端都没有问题。 (也许JAX-WS或Java通常会采用某种元素名称修饰或忽略它?)
有没有人看过这个? 有没有人有办法解决吗? 有没有可能在Reference.cs中装饰某些东西来翻译或映射元素名称,或者是沿着这些线条的东西? 我不是一位SOAP或XML专家; 我是否误解了有关SOAP和/或XSD元素命名规则的内容? 是否可以更改XSD以满足请求和响应?
链接地址: http://www.djcxy.com/p/34303.html上一篇: WS service with response elements not in the XSD
下一篇: Importing key/value complexType definition from WSDL in WCF and Biztalk