【发布时间】:2016-04-01 15:02:29
【问题描述】:
我最近为客户重新编写了 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,然后重试。 -
它没有。我继承了这个,写它时周围的人都没有了。看起来服务器有免费送货的规范,但它不是必需的,也不是总是发送的。服务的设计有点奇怪,不是 我 会怎么做,但我不允许更改消息格式,所以... :(
标签: .net web-services wcf soap