Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带有TransferMode=Streamed的WCF REST客户端-记录整个(“原始”)http请求/响应_C#_.net_Wcf_Rest_Http Headers - Fatal编程技术网

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

C# 带有TransferMode=Streamed的WCF REST客户端-记录整个(“原始”)http请求/响应,c#,.net,wcf,rest,http-headers,C#,.net,Wcf,Rest,Http Headers,这是在.NET4上,完整的框架 我正在尝试制作一个简单的winforms应用程序,它将进行一些简单的WCF REST调用。它使用ChannelFactory和服务合同接口。在接口中的20种方法中,有2种涉及流(上传和下载方法),因此服务端(目前也是客户端)使用TransferMode=Streamed 我的目标是在winforms应用程序的文本框中包含完整的HTTP请求和响应(就像您在ethereal/wireshark或fiddler中看到的那样),并带有标题(只是为了显示通过网络传输的内容)

这是在.NET4上,完整的框架

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

我的目标是在winforms应用程序的文本框中包含完整的HTTP请求和响应(就像您在ethereal/wireshark或fiddler中看到的那样),并带有标题(只是为了显示通过网络传输的内容)

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

  • 在BeforeSendRequest和AfterReceiverReply中执行request.ToString()或reply.ToString()时,它只获取“body”,而不获取标题。在调试器中仔细查看对象,看起来回复中有这些对象。属性[“httpResponse”],但请求的请求。属性[“httpRequest”]有一个空标题属性,即使Fiddler显示内容类型、主机、接受编码和连接的标题。似乎有更好的方法可以获取我丢失的“原始”消息(如果没有,可能有人知道现有的代码块,可以从消息中“重建”原始代码)
  • 由于传输模式为流传输,“主体”部分仅显示为字符串“。。。stream…',在SvcTraceViewer中(以及“原始”svclog-即使logEntireMessage=true)和执行ToString()时。如果改为缓冲模式,则显示实际车身状况良好。我尝试使用reply.CreateBufferedCopy(int.MaxValue)制作副本;但这导致实际的WCF调用失败,出现InvalidOperationException:此消息无法支持该操作,因为它已被复制
  • 一种退路是将客户端移动到Buffered,只需更改一次上载调用的StreamdRequest和下载调用的StreamdResponse(但我必须以编程方式AFAICT进行此操作,因为它在配置中设置为绑定级别,我看不到通过调用上的属性进行此操作),这将处理“正文”部分,只留下“获取http请求头”(问题#1,特别是request.Properties[“httpRequest”].headers为空)来处理,但我希望有某种方法可以记录“原始”消息,而不必这样做,让TransferMode保持流式传输


    谢谢

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

    以下是来源:关于MSDN

    请参见本页末尾:

    服务水平

    在此层记录的消息是 即将进入(接收时)或离开 (发送时)用户代码。中频滤波器 已定义,只有 匹配已记录的过滤器。 否则,服务中的所有消息 记录液位。基础设施 消息(事务、对等通道、, 和安全性)也记录在该位置 级别,但可靠的消息传递除外 信息仅适用于流式消息 将记录标题。此外, 安全消息被记录并解密 在这个层次上


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

    以下是来源:关于MSDN

    请参见本页末尾:

    服务水平

    在此层记录的消息是 即将进入(接收时)或离开 (发送时)用户代码。中频滤波器 已定义,只有 匹配已记录的过滤器。 否则,服务中的所有消息 记录液位。基础设施 消息(事务、对等通道、, 和安全性)也记录在该位置 级别,但可靠的消息传递除外 信息仅适用于流式消息 将记录标题。此外, 安全消息被记录并解密 在这个层次上


    是的,现有的跟踪不会记录流式消息(至少在WCF服务和传输层,我想知道是否有较低级别的跟踪可以做到这一点?),这就是为什么我认为我最终必须“定制”这样做的原因,由于IClientMessageInspector是我现在尝试的:)这是客户端配置中缓冲的所有内容的一个优点,然后分别(以编程方式)进行上传和下载StreamdRequest和StreamdResponse,但是如果可能的话,我正在尝试做一些不需要更改现有配置/代码的事情:)您找到了这样做的方法吗?是的,现有跟踪不会记录流式消息(至少在WCF服务和传输层,我想知道是否有较低级别的跟踪可以做到这一点?)这就是为什么我认为我最终必须“定制”,而IClientMessageInspector正是我现在尝试的:)这是客户端配置中缓冲的所有内容的优势,然后分别(以编程方式)进行上传和下载StreamdRequest和StreamdResponse,但是我正在尝试做一些不需要更改现有配置/代码的东西(如果可能的话):)你找到了这样做的方法吗?