我最近为一位客户重新编写了一个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深处设置的奇怪、晦涩的标志只需要被翻转就可以了。
谢谢, 詹姆斯