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

Way*_*neC 1 c# 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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 韦恩

car*_*ira 6

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

  • 实际上,我根据您的文章找到了一种非常简单的方法来获取消息中的所有 SOAP 标头:http://blogs.msdn.com/b/carlosfigueira/archive/2011/08/02/wcf-extensibility-system-诊断跟踪.aspx。我基本上创建了一个自定义跟踪侦听器,它将相关消息保存在 HTTP 会话中,可以在 GUI 中检索并显示该消息。 (2认同)