WCF消息格式化

3

我最近为一位客户重新编写了一个WCF服务。他们以前的服务是在.NET 3.5上运行的,我对代码进行了清理并升级到了4.5.2。

从功能上讲,服务是正常工作的,但我在某些消息格式方面遇到了问题不匹配的情况。

当我使用WCF服务客户端测试服务时,我会收到以下结构的消息:

<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">
  <s:Header>
    <a:Action s:mustUnderstand="1">http://XXXXX.com/XXXXX/service/v1_0/IXXXXXInterfacePort/GetRates</a:Action>
    <a:MessageID>urn:uuid:071db031-f492-42f5-89e6-fb4a321c81c9</a:MessageID>
    <a:ReplyTo>
      <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
    </a:ReplyTo>
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <GetRatesIP xmlns="http://XXXXX.com/XXXXX/service/v1_0">
      <ShipmentHeader xmlns="">
        <ShipmentID>XXXXX</ShipmentID>
        <Zipcode>XXXXX</Zipcode>
      </ShipmentHeader>
      <ShipmentItemsList xmlns="">
        <ShipmentItems>
          <quantity>10</quantity>
          <sku>XXXXX</sku>
          <freeShipping>true</freeShipping>
        </ShipmentItems>
      </ShipmentItemsList>
    </GetRatesIP>
  </s:Body>

但是,当客户端将服务放入测试时,来自客户端的消息结构看起来像这样:

<?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>
  <GetRatesIP xmlns="http://XXXXX.com/XXXXX/service/v1_0">
   <ShipmentHeader xmlns="">
    <ShipmentID>XXXXX</ShipmentID>
    <Zipcode>XXXXX</Zipcode>
   </ShipmentHeader>
   <ShipmentItemsList xmlns="">
    <ShipmentItems>
     <quantity>10</quantity>
     <sku>XXXXX</sku>
    </ShipmentItems>
   </ShipmentItemsList>
  </GetRatesIP>
 </soap:Body>
</soap:Envelope>

数据方面,一切似乎都没问题。我的版本有一个免运费属性,但据我所见,这个服务将其视为可选项,如果缺少也应该没问题。无论如何,客户声称即使它在代码中,该值也从未被发送过来,尽管它在他们的代码中提到了。
我猜测是因为服务在“soap:Envelope …”样式与“s:Envelope…”样式之间遇到了麻烦。我使用了完全相同的服务协议。现有代码使用XML序列化器而不是数据契约序列化器,但我复制了所有属性(Serializable、XmlType、XmlArray、XmlArrayItem等)和MessageContract属性,与现有代码完全相同。查看服务器上的配置,没有发现任何问题。正在努力获取客户端配置,但不期望它能帮助解决问题。
有人知道这里可能出了什么问题吗?我一直在互联网上寻找答案,但没有找到。我的运气,可能是一些在Visual Studio/WCF深处设置的奇怪、晦涩的标志只需要被翻转就可以了。
谢谢, 詹姆斯

在客户端,包含“freeShipping”属性的类是否还包含一个名为“freeShippingSpecified”的属性?如果是,请将该属性设置为true,然后重试。 - Amith Sewnarain
不是的。这是我继承的,当时编写代码的人已经离开了。看起来服务器有一个免费送货的规格,但它不是必需的,也不总是发送。服务的设计有点奇怪,不是我会做的方式,但我不被允许更改消息格式,所以... :( - James Bender
3个回答

2

1
将绑定从WSHttpBinding(默认为SOAP 1.2)更改为使用BasicHttpBinding(默认为1.1)
或者,您可以通过强制更改BasicHttpBinding使用的soap版本来使用SOAP 1.2
`<textMessageEncoding messageVersion="Soap12" />` 

在customBindingConfig部分中。

抱歉,上周在度假,现在才看到这个消息。只是想澄清一下;我的服务库中的app.config使用basicHttpBinding,而我的网站上的web.config根本没有绑定。那么,WCF是否默认使用WSHttpBinding,这就是我的问题所在吗?如果我在web.config中添加一个终结点,那应该可以解决吧?我之所以问这个问题,是因为我需要客户端进行交互,而我不想没有所有细节就过多地打扰他。 - James Bender
也许这会有所帮助:https://dev59.com/FG025IYBdhLWcg3wAxF9 - NatarajC
正如另一个线程所提到的,默认情况下是使用1.1的BasicHttpBinding,因此您需要在两端都进行配置,并确保绑定相同,否则就会出现这种错误。 - NatarajC
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - James Bender
需要通过声明自定义绑定来强制 BasicHttpBinding 使用 SOAP1.1,然后进行测试,并查看生成的 SOAP 包与客户端发送的内容相同。 - NatarajC
显示剩余3条评论

0
所以,事实证明,编写服务初始版本的人没有使用“I”作为第一个字符来命名他们基于服务合同的接口。即使在配置中指定了特定的操作,这也会导致消息格式不匹配。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接