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

时间:2011-08-02 22:00:55

标签: 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;
}

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

  • 韦恩

1 个答案:

答案 0 :(得分:6)

检查员在消息存在格式化之后立即查看消息,并且在它到达任何协议通道(例如安全性)之前,它将(可能)在将消息传递之前更改消息(请参阅帖子中的图表)关于http://blogs.msdn.com/b/carlosfigueira/archive/2011/07/12/wcf-extensibility-channels.aspx处的WCF频道。因此,在检查器级别,您将无法找到消息添加的任何其他SOAP标头。 HTTP标头由传输添加,在邮件通过邮件检查器后也会到达。

如果要查看消息中的所有SOAP标头,可以创建一个新的“协议”通道(http://msdn.microsoft.com/en-us/library/ms751495.aspx处的样本完全相同)或新的消息编码器(它可以包装现有的编码器,并在编码之前检查传出消息。

为了能够看到HTTP标头,它更难,因为传输是消息在WCF中传递的最后一部分。我认为你可以编写一个自定义传输通道来做到这一点,但这绝对是很多代码。