使用TransferMode = Streamed的WCF REST客户端 - 记录整个(“原始”)http请求/响应

时间:2010-07-18 18:48:49

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

这是.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()时,它只获取“body”而不是标题。在调试器中的对象中挖掘它看起来像回复有它们的回复.Properties [“httpResponse”],但请求的request.Properties [“httpRequest”]有一个空的Headers属性,即使Fiddler显示Content-Type的标题,主机,接受编码和连接。似乎有可能有更好的方法来获取我丢失的“原始”消息(如果没有,有人可能知道现有的一大堆代码来'重建'消息中的原始消息)
  2. 由于传输模式是Streamed,'body'部分只显示为字符串'... stream ...',在SvcTraceViewer(和'raw'svvog - 甚至logEntireMessage = true)中都显示为做一个ToString()。如果模式是缓冲的,它会显示实际的身体。我试着用reply.CreateBufferedCopy(int.MaxValue)制作副本;但是这导致实际的WCF调用因InvalidOperationException而失败:此消息不支持该操作,因为它已被复制。
  3. 一个回退是将客户端移动到缓冲区,然后只更改为一个上传调用的StreamedRequest和下载调用的StreamedResponse(但是我必须以编程方式AFAICT执行此操作,因为它是在绑定级别设置的配置,我不会看到通过调用上的属性做到这一点),这将照顾'body'部分,并留下我只是“获取http请求标题”(问题#1,特别是request.Properties [“httpRequest”]。标题是空的)要处理,但我希望有一些方法可以记录“原始”消息而不这样做,将TransferMode保留为流式。

    谢谢!

1 个答案:

答案 0 :(得分:1)

我现在找不到任何引用,但是已知的事实是您无法将流式消息的内容捕获到WCF跟踪。启用流式传输时,只会跟踪邮件的标题。

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

请参阅页面末尾:

  

服务水平

     

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