在Web服务调用期间删除了SOAP标头

时间:2012-02-16 14:33:24

标签: .net wcf soap

我正在测试从.net客户端应用程序调用基于SOAP的服务,并且遇到一些奇怪的问题,SOAP标头似乎消失了。

设置的简要说明:

我使用了webservice提供者提供的WSDL来创建我的代理对象。在我的代码中,声明了我想要调用的服务客户端的实例。构建方法所需的有效负载,然后调用该方法。

我已经定义了自己的检查器,它将请求消息写入BeforeSendRequest函数中的文本文件,以便我可以检查发送的内容。

我的输出文件包含一个SOAP Header,指定要调用的SOAP Action:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">urn:actionName</Action>
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

然而,当我在Fiddler中检查请求时,我看到:

POST http://itk1:4848/syncsoap HTTP/1.1
Content-Type: text/xml; charset=utf-8
VsDebuggerCausalityData: uIDPo3+FD6fhly5OnM0GeeaNhJ8AAAAAqHE+abP1+EWcEPeRvh8Oj4EFi5tL0elHlKdqfGJg1AIACQAA
SOAPAction: "urn:actionName"
Host: itk1:4848
Content-Length: 9651
Expect: 100-continue
Connection: Keep-Alive

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body

我的操作似乎已从SOAP信封中删除,并且已成为基本标头,因此当我正在调用的服务获取请求时,它无法在预期位置找到该操作。

作为测试,我试图使用WebRequest.Create()创建一个基本请求,然后发布我之前从消息检查器中检索到的输出文件。当这个命中时,Fiddler表明SOAP Header和Action已保留在SOAP信封中。

我认为这是WCF有用并修改我对我的要求?我怎样才能让它停止用我的信息搞砸并按原来的方式发送它?

2 个答案:

答案 0 :(得分:1)

我已使用邮件检查程序手动编写自己的标题来解决此问题。

即。在BeforeSendRequest中,我现在正在做:

request.Headers.Add(MessageHeader.CreateHeader("Action", WSANamespace, _headerInfo.Action))

将其与我需要的其他一些SOAP标头一起正确写出来。

奇怪的是,如果我向调试监听器写出请求,我看到信封现在包含2个Action标题,但是当请求到达Fiddler时,信封中只有一个Action,一切看起来都很好 - 我很高兴离开原始操作转换为HTTP标头,因为我正在调用的服务无论如何都要求。

答案 1 :(得分:0)

尝试使用IDispatchMessageFormatter进行调试,如此链接所示http://blogs.msdn.com/b/carlosfigueira/archive/2011/05/03/wcf-extensibility-message-formatters.aspx

为了理解WCF管道中的阶段,请参阅 http://msdn.microsoft.com/en-us/magazine/cc163302.aspx