带有不在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