【问题标题】:WCF SOAP reply to ASMX SOAP reply formatWCF SOAP 回复到 ASMX SOAP 回复格式
【发布时间】:2012-11-17 21:09:55
【问题描述】:

我有一个第三方 SOAP 客户端,它能够与旧的 ASMX Web 服务进行通信。

问题出在 WCF 服务上。

我的 WCF 服务从该客户端接收消息没有问题,但客户端不喜欢我的 WCF 响应。

我的测试 WCF 服务发出以下响应:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
 <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <testResponse xmlns="http://www.tempuri.org">
   <testResult>randomStringData</testResult>
  </testResponse>
 </s:Body>
</s:Envelope>

但是旧的 SOAP 客户端期望这种响应(ASMX 服务):

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <soap:Body>
  <testResponse xmlns="http://tempuri.org/">
   <testResult>randomStringData</testResult>
  </testResponse>
 </soap:Body>
</soap:Envelope>

我无法控制客户端。 有没有办法可以配置我的 WCF 以发送与我的 ASMX 服务完全相同的消息?

我的 WCF 服务正在使用以下绑定:

<customBinding>
    <binding name="soap11">
      <textMessageEncoding messageVersion="Soap11" writeEncoding="utf-8"></textMessageEncoding>
      <httpTransport></httpTransport>
    </binding>
  </customBinding>

【问题讨论】:

  • 如果这两个响应之间的唯一区别是“s:”而不是“soap:”,那么就 XML 而言,两者是相同的。即使对于传统的 ASMX 服务或客户端,两者也是相同的。命名空间前缀(“s:”)只是实际命名空间的别名,命名空间是一样的。
  • 我感觉旧的 SOAP 客户端具有硬编码的 xml 解析,并且正在搜索字符串“
  • 我认为 John 关于 s:soap: 相同的说法是正确的,无论如何您可以尝试 curl 以实际发送原始 xml,因此您可以使用 soap: as namespace 配置soap调用跨度>

标签: wcf soap


【解决方案1】:

我设法通过自定义消息检查器和 BeforeSendReply 方法解决了前缀问题。

http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.idispatchmessageinspector.beforesendreply.aspx

P.S 另一个很棒的方法是 AfterReceiveRequest 用于各种消息调整魔法!

【讨论】:

  • 如果更改前缀确实有效,那么您应该向该服务的所有者提交错误报告。实际的前缀完全没有意义。或者更确切地说,它应该完全没有意义。确保您的伴侣知道这一点,以帮助他们。
  • 已经完成 :) 答案如预期......使用标准!我们的标准!大声笑。
猜你喜欢
  • 1970-01-01
  • 2014-01-29
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-15
相关资源
最近更新 更多