【问题标题】:How to obtain header values from Client Message Inspector in WCF如何从 WCF 中的客户端消息检查器获取标头值
【发布时间】:2011-08-02 22:00:54
【问题描述】:

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

我实现了一个 MessageInspector 类,它实现了IClientMessageInspector,最值得注意的是BeforeSendRequestAfterReceiveReply 方法来分别访问请求和响应消息。

捕获响应 (AfterReceiveReply) 效果很好,但捕获请求仅部分有效。我可以访问大部分消息,但是 SOAP 标头和 HTTP 标头都是空的。在 Fiddler 中查看请求,我可以看到 WCF 在 SOAP 消息中发送了一个安全标头和“一堆”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 和安全标头。有没有更好的方法来做到这一点?

  • 韦恩

【问题讨论】:

    标签: c# wcf


    【解决方案1】:

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

    如果您想查看消息中的所有 SOAP 标头,您可以创建一个新的“协议”通道(http://msdn.microsoft.com/en-us/library/ms751495.aspx 的示例正是这样做的)或一个新的消息编码器(它可以包装现有的编码器,并在它们被编码之前检查传出的消息)。

    要查看 HTTP 标头就更难了,因为传输是消息在 WCF 中通过的最后一部分。我认为您可以编写一个自定义传输通道来做到这一点,但这肯定会是很多代码。

    【讨论】:

    • 很好的信息...谢谢。将使用自定义消息编码器路由。
    • 根据您的文章,我实际上找到了一种非常简单的方法来获取消息中的所有 SOAP 标头:blogs.msdn.com/b/carlosfigueira/archive/2011/08/02/…。我基本上创建了一个自定义跟踪侦听器,它将相关消息保存在 HTTP 会话中,可以在 GUI 中检索和显示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    相关资源
    最近更新 更多