【问题标题】:WCF REST client with TransferMode=Streamed - logging entire ("raw") http requests/responses带有 TransferMode=Streamed 的 WCF REST 客户端 - 记录整个(“原始”)http 请求/响应
【发布时间】:2010-07-18 18:48:48
【问题描述】:

这是基于 .Net 4 的完整框架。

我正在尝试制作一个简单的 winforms 应用程序,该应用程序将进行一些简单的 WCF REST 调用。它使用 ChannelFactory 和服务合同接口。在接口中的大约 20 个方法中,其中 2 个涉及 Stream(上传和下载方法),因此服务端(目前也是客户端)使用 TransferMode=Streamed。

我的目标是在 winforms 应用程序的文本框中包含完整的 HTTP 请求和响应(就像您在 ethereal/wireshark 或 fiddler 或其他任何内容中看到的那样)和标头(只是为了显示过去的内容)电线)

在尝试使用内置诊断(通过 SvcConfigEditor)和我自己的(通过实现 IClientMessageInspector 然后 IEndpointBehavior 添加检查器,然后 channelFactory.Endpoint.Behaviors.Add 添加行为:),我有2个问题:

  1. 在 BeforeSendRequest 和 AfterReceiveReply 中执行 request.ToString() 或 reply.ToString() 时,它只获得“正文”而不是标头。在调试器中挖掘对象,看起来回复中有它们在 reply.Properties["httpResponse"] 中,但是请求的 request.Properties["httpRequest"] 有一个空的 Headers 属性,即使 Fiddler 显示了 Content-Type 的标头、主机、接受编码和连接。似乎有更好的方法来获取我丢失的“原始”消息(如果没有,有人可能知道现有的代码块可以从消息中“重建”原始消息)
  2. 由于传输模式为流式传输,“主体”部分在 SvcTraceViewer(和“原始”svclog - 即使 logEntireMessage=true 时)中都显示为字符串“...流...”做一个 ToString()。如果模式是缓冲模式,它会显示实际的主体。我尝试使用 reply.CreateBufferedCopy(int.MaxValue); 制作副本但这会导致实际的 WCF 调用失败并出现 InvalidOperationException:此消息无法支持该操作,因为它已被复制。

一个后备方案是将客户端移动到 Buffered,然后将一个上传调用更改为 StreamedRequest,将下载调用更改为 StreamedResponse(但我必须以编程方式 AFAICT 执行此操作,因为它设置在config 并且我看不到通过调用上的属性来执行此操作),这将处理“正文”部分,只留下“获取 http 请求标头”(问题 #1,特别是 request.Properties ["httpRequest"].Headers 为空) 来处理,但我希望有某种方法可以在不这样做的情况下记录“原始”消息,将 TransferMode 保留为 Streamed。

谢谢!

【问题讨论】:

    标签: c# .net wcf rest http-headers


    【解决方案1】:

    我现在找不到任何参考资料,但众所周知,您无法将流式消息的内容捕获到 WCF 跟踪。启用流式传输后,将仅跟踪消息的标头。

    以下是来源:MSDN 上的Configuring Message Logging

    查看页面末尾:

    服务水平

    在这一层记录的消息是 即将进入(收到)或离开 (发送时)用户代码。如果过滤器 已定义,只有消息 匹配过滤器被记录。 否则,服务中的所有消息 级别被记录。基础设施 消息(交易、对等通道、 和安全性)也记录在此 级别,可靠消息传递除外 消息。 在流式消息中,仅 标头已记录。此外, 安全消息被记录解密 在这个级别。

    【讨论】:

    • 对,现有的跟踪不会记录流式消息(至少在 WCF 服务和传输层,我想知道是否有较低级别的跟踪可以做到这一点?)这就是为什么我想我'最终不得不'自定义',IClientMessageInspector 是我现在正在尝试的:) 这是客户端配置中缓冲的所有内容的优势,然后分别(以编程方式)上传和下载 StreamedRequest 和 StreamedResponse,但我如果可能的话,我正在尝试做一些不需要更改现有配置/代码的东西:)
    • 你找到方法了吗?
    猜你喜欢
    • 2023-03-09
    • 2021-11-15
    • 2012-09-15
    • 2011-02-01
    • 1970-01-01
    • 2021-10-16
    • 2012-02-08
    • 2010-11-05
    • 2021-12-08
    相关资源
    最近更新 更多