在SOAP信封中为使用svcutil生成的类设置名称空间

时间:2012-03-15 15:06:05

标签: wcf serialization soap svcutil.exe

我们正在使用提供给我们的WSDL和XSD进行第三方集成。我们已经使用svcutil来为我们生成所有代理类,它们工作正常。当我们使用SoapUi进行测试时,一切正常,但是,当我们尝试将响应发送给我们的合作伙伴时,他们拒绝接收SOAP消息,因为命名空间是在消息头和正文中而不是SOAP信封中定义的。

不幸的是,我无法让我们的合作伙伴更改他们的流程来接受我们的消息(尽管我认为它们在技术上是正确的,因为我们在XML中使用它们之前定义了命名空间,而不是他们期望的那些)。我知道在出去之前我可以让消息检查员按下SOAP消息,但我宁愿不去那个级别的处理。

是否有svcutil的设置,甚至是我们可以设置为让WCF在信封上输出命名空间的序列化属性的设置?

他们想要什么:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:h="http://theirdomain.org/service">
  <s:Header>
    <h:myType>
      <version>V1.0</version>
    </h:myType>
  </s:Header>
  <s:Body>
    <h:someElement />
  </s:Body>
</s:Envelope>

我们发送的内容:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" >
  <s:Header>
    <h:myType xmlns:h="http://theirdomain.org/service">
      <version>V1.0</version>
    </h:myType>
  </s:Header>
  <s:Body>
    <h:someElement xmlns:h="http://theirdomain.org/service"/>
  </s:Body>
</s:Envelope>

1 个答案:

答案 0 :(得分:2)

我认为正确的扩展点可能是自定义编码器(请参阅http://msdn.microsoft.com/en-us/library/ms735115.aspxhttp://msdn.microsoft.com/en-us/library/ee960159.aspx处的示例,尤其是第一个)。在自定义编码器中,您将自己编写SOAP Envelope(使用正确的命名空间),然后调用Message对象上的方法来写出标题和正文(例如WriteBodyContents,请参阅http://msdn.microsoft.com/en-us/library/ms734675.aspx - 在“Writing Messages”下)。