我最近为客户重写了一个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>
&#13;
但是当客户端对服务进行测试时,来自客户端的消息结构如下所示:
<?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>
&#13;
数据明智,一切似乎都好。我的版本有免费送货属性,但从我可以看到,这被服务视为可选,如果缺少则应该没问题。无论如何,客户声称即使它在代码中的价值从未由服务客户端发送过,即使它们在代码中提到过。
我的猜测是该服务在使用&#34; soap:Envelope ...&#34;风格与&#34; s:信封......&#34;样式。我使用了完全相同的服务合同。现有代码使用XML序列化程序而不是数据契约序列化程序,但我再次从现有代码中复制了属性(Serializable,XmlType,XmlArray,XmlArrayItem等)和MessageContract属性。看着服务器上的配置,没有什么看错了。努力获得客户端配置,但不要期望它能够解决问题。
任何人都知道这里会发生什么?我已经(并将继续)在互联网上看,但我没有找到答案。我的运气,它是一些奇怪的,模糊的标志设置在Visual Studio / WCF的碗里,只需要翻转。
谢谢, 詹姆斯
答案 0 :(得分:2)
您的测试使用带有WS-Addressing的SOAP 1.2 (http://www.w3.org/2003/05/soap-envelope)(标题条目a:Action
,a:MessageID
,...),而客户端使用SOAP 1.1 (http://schemas.xmlsoap.org/soap/envelope/)。
这是一个具有约束力的问题。如果您希望客户端保持原样,请更改服务端的绑定。
答案 1 :(得分:0)
因此,事实证明,无论是谁编写了服务的初始版本,都没有使用“I”作为第一个字符来命名他们基于服务合同的接口。即使在配置中指定了特定的Action,也会导致消息格式不匹配。