【问题标题】:WCF Message formattingWCF 消息格式
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    将绑定从 WSHttpBinding(默认 SOAP 1.2)更​​改为使用 BasicHttpBinding(默认为 1.1)

    或者你可以强制将BasicHttpBinding使用的soap版本改为使用SOAP 1.2 by

    `<textMessageEncoding messageVersion="Soap12" />` 
    

    在 customBindingConfig 部分中。

    【讨论】:

    • 对不起,上周在度假,现在才看到这个。只是为了澄清;我的服务库中的 app.config 正在使用 basicHttpBinding,而我网站上的 web.config 根本没有绑定。那么,WCF 是否默认为 WSHttpBinding,这是我的问题吗?如果我将端点添加到应该修复它的 web.config?我之所以这样问是因为我需要与客户互动才能做到这一点,而且我不想在没有所有细节的情况下过多地打扰他。
    • 这可能会有所帮助stackoverflow.com/questions/6263813/…
    • 因为其他线程提到默认是1.1的BsicHttpBinding,所以你需要在两端放一个配置,并确保绑定相同,否则会弹出这种错误。
    • 好的,正在尝试访问客户端配置,但它由第三方维护,客户端无法获取它。与此同时,我在 web.config 中添加了端点,它仍然在 WSDL 中以 SOAP12 的形式出现。配置是 ->
    • 需要通过声明一个自定义绑定来强制BasicHttpBinding使用SOAP1.1,然后对其进行测试,并查看生成的SOAP信封与客户端发送的相同。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多