我正在为我正在处理的一些服务创建一个Web测试客户端,并且作为其要求的一部分,我希望能够显示完整的请求和响应SOAP消息(以及用户的HTTP头).
我实现了一个实现IClientMessageInspector的MessageInspector类,最着名的是分别访问请求和响应消息的方法BeforeSendRequest
和AfterReceiveReply
方法.
捕获响应(AfterReceiveReply)效果很好,但捕获请求只能部分工作.我可以访问大部分消息,但SOAP标头和HTTP标头都是空的.在Fiddler中查看请求,我可以看到WCF正在SOAP消息中发送一个Security头和一堆HTTP头.
我的BeforeSendRequest
方法非常简单......它的要点是......
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
this.RequestMessage = request.ToString(); // Security header is missing from message
// Try to get HTTP headers
object req; // req is always null
if (request.Properties.TryGetValue(HttpRequestMessageProperty.Name, out req))
{
this.RequestHeaders = ((HttpRequestMessageProperty)req).Headers;
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
我不确定为什么缺少HTTP和安全标头.有一个更好的方法吗?
检查员在消息存在格式化之后立即查看消息,并且在它到达任何协议通道(例如安全性)之前,它将(可能)在传递消息之前更改消息(请参阅有关WCF通道的帖子中的图表)在http://blogs.msdn.com/b/carlosfigueira/archive/2011/07/12/wcf-extensibility-channels.aspx).因此,在检查器级别,您将无法找到消息添加的任何其他SOAP标头.HTTP标头由传输添加,在邮件通过邮件检查器后也会到达.
如果要查看消息中的所有SOAP标头,可以创建一个新的"协议"通道(http://msdn.microsoft.com/en-us/library/ms751495.aspx上的示例就是这样做的)或者新的消息编码器(它可以包装现有的编码器,并在编码之前检查外发消息).
为了能够看到HTTP头,它更难,因为传输是消息在WCF中传递的最后一部分.我认为你可以写一个自定义传输通道来做到这一点,但这肯定会是很多代码.