0

据我了解,发布您学到的一些有用信息的最佳方式是自己提出问题然后回答,所以就这样吧。

场景:

  • 我们有一个应用程序,它从模板 xslt 文件构造一个 SOAP 请求,并包含一些参数,包括 MessageID
  • 它访问的真实服务就像请求一样,愉快地响应,我们的客户端愉快地处理响应
  • 我们正在尝试构建一个模拟服务的存根/响应程序
  • stub 只是实现 IHttpHandler 并响应任何 POST 操作
  • 存根从 XML 文件中读取预设响应,这是一个真实响应的示例,并通过网络发送它
  • Visual Round Trip Analyzer (NetMon under the hood) 和 Fiddler 都可以看到通过线路传输到客户端的响应
  • SendRequestResponse 最终超时并引发异常
4

1 回答 1

0

SoapClient.SendRequestResponse 知道传出请求 SOAP 标头中的 MessageID,并且在接收到带有与原始 MessageID 匹配的 RelatesTo 值的消息之前不会完成调用。因此,如果您正在制作响应程序/存根,您需要从请求中解析出 MessageID 并将其注入响应的 SOAP 标头中的 RelatesTo 字段。

有点奇怪的是,它不仅仅在任何有效的 SOAP 消息之后返回,并且由于不匹配而引发了一个期望。也许这是 SOAP Web 服务标准的一部分。我没有调查它。

例子:

要求:

<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/" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/03/addressing" xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility">
  <soap:Header>
    <wsa:MessageID soap:mustUnderstand="1">uuid:20E6C5D8-2E0D-48D0-863D-7789D2CA37A2</wsa:MessageID>
...

回复:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/03/addressing" xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility">
  <soap:Header>
    <wsa:MessageID SOAP-ENV:mustUnderstand="1" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">uuid:bb1cf43050739c45:248138d0:1328e31d4e2:-5cf4</wsa:MessageID>
    <wsa:RelatesTo RelationshipType="wsa:Reply" SOAP-ENV:mustUnderstand="1" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">uuid:20E6C5D8-2E0D-48D0-863D-7789D2CA37A2</wsa:RelatesTo>
...

The RelatesTo value is the same as the MessageID value in the request. The MessageID in the response is new and unique because the response message is not the request message.

于 2011-10-17T16:18:41.150 回答