如何从WCF中的客户端消息检查器获取标头值

我正在为我正在处理的一些服务创建一个Web测试客户端,并且作为其要求的一部分,我希望能够显示完整的请求和响应SOAP消息(以及用户的HTTP头)。

我实现了一个实现IClientMessageInspector的MessageInspector类,最着名的是BeforeSendRequestAfterReceiveReply方法,分别用于访问请求和响应消息。

捕获响应(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; } 

我不确定为什么缺少HTTP和安全标头。 有一个更好的方法吗?

  • 韦恩

检查员在消息存在格式化之后立即查看消息,并且在它到达任何协议通道(例如安全性)之前,它将(可能)在将消息传递之前更改消息(请参阅有关WCF通道的post中的图表)在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中传递的最后一部分。 我认为你可以写一个自定义传输通道来做到这一点,但这肯定会是很多代码。