【问题标题】:Set namespaces in SOAP envelope for classes generated using svcutil在 SOAP 信封中为使用 svcutil 生成的类设置命名空间
【发布时间】:2012-04-01 03:00:45
【问题描述】:

我们正在使用提供给我们的 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>

【问题讨论】:

  • 我们尝试了 xmlserializer 和 DataContractSerializer,结果相同。
  • 他们期望什么样的编码。我有一个类似的问题,我的 XML 是有效的,但在我发送 UTF-16 时编码应该是 UTF-8。如果问题仍然相关......
  • 这个问题仍然很重要。我们很快就会完成,需要解决这个问题以确保一致性。您是如何解决编码问题的?
  • 我扩展了StringWriter 并通过默认返回Encoding.UTF8 覆盖Encoding 属性。然后使用这个StringWriterUTF8 类将其注入XmlWriter
  • 到目前为止,我们一直让 WCF 为我们处理所有序列化。我一直希望避免编写我们自己的序列化,但我认为由于这个问题,这可能是不可避免的。

标签: wcf serialization soap svcutil.exe


【解决方案1】:

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

【讨论】:

  • 这看起来很有希望。感谢您的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多