WCF邮件格式

时间:2016-04-01 15:02:30

标签: .net web-services wcf soap

我最近为客户重写了一个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;
&#13;
&#13;

但是当客户端对服务进行测试时,来自客户端的消息结构如下所示:

&#13;
&#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;
&#13;
&#13;

数据明智,一切似乎都好。我的版本有免费送货属性,但从我可以看到,这被服务视为可选,如果缺少则应该没问题。无论如何,客户声称即使它在代码中的价值从未由服务客户端发送过,即使它们在代码中提到过。

我的猜测是该服务在使用&#34; soap:Envelope ...&#34;风格与&#34; s:信封......&#34;样式。我使用了完全相同的服务合同。现有代码使用XML序列化程序而不是数据契约序列化程序,但我再次从现有代码中复制了属性(Serializable,XmlType,XmlArray,XmlArrayItem等)和MessageContract属性。看着服务器上的配置,没有什么看错了。努力获得客户端配置,但不要期望它能够解决问题。

任何人都知道这里会发生什么?我已经(并将继续)在互联网上看,但我没有找到答案。我的运气,它是一些奇怪的,模糊的标志设置在Visual Studio / WCF的碗里,只需要翻转。

谢谢, 詹姆斯

2 个答案:

答案 0 :(得分:2)

您的测试使用带有WS-Addressing的SOAP 1.2 http://www.w3.org/2003/05/soap-envelope)(标题条目a:Actiona:MessageID,...),而客户端使用SOAP 1.1 http://schemas.xmlsoap.org/soap/envelope/)。

这是一个具有约束力的问题。如果您希望客户端保持原样,请更改服务端的绑定。

答案 1 :(得分:0)

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