【发布时间】: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个问题:
- 在 BeforeSendRequest 和 AfterReceiveReply 中执行 request.ToString() 或 reply.ToString() 时,它只获得“正文”而不是标头。在调试器中挖掘对象,看起来回复中有它们在 reply.Properties["httpResponse"] 中,但是请求的 request.Properties["httpRequest"] 有一个空的 Headers 属性,即使 Fiddler 显示了 Content-Type 的标头、主机、接受编码和连接。似乎有更好的方法来获取我丢失的“原始”消息(如果没有,有人可能知道现有的代码块可以从消息中“重建”原始消息)
- 由于传输模式为流式传输,“主体”部分在 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