我正在测试从.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有用并修改我对我的要求?我怎样才能让它停止用我的信息搞砸并按原来的方式发送它?
答案 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