.net - 如何在传输级别压缩来自 WCF .NET 的 HTTP 请求?

标签 .net wcf compression httpwebrequest gzip

我已经成功enable inbound HTTP compression on ASP.NET (即压缩 HTTP 请求,而不仅仅是响应),但我现在在客户端(C#/.NET 4.0 应用程序)上苦苦挣扎。

我愿意:

  • 添加 HTTP header Content-Encoding: gzip
  • 使用 GZip 压缩 HTTP 正文

WCF channel 发出的所有出站 HTTP 请求。

到目前为止不起作用的解决方案:

  • 使用 IClientMessageInspector 我可以压缩消息,但它不能解释整个 HTTP 正文,因为信封未压缩。
  • 与自定义消息编码器相同,压缩消息而不是信封,对 HTTP 请求 header 没有影响。

知道如何在客户端模仿 IHttpModule 行为(请参阅初始响应)吗?

最佳答案

消息编码器描述here应该做这项工作。

我已经使用从上述文章中提供的链接下载的示例(来自 this 的 InstallDrive\WF_WCF_Samples\WCF\Extensibility\MessageEncoder\Compression 项目)和 Fiddler 进行了测试。

请注意,MSDN 示例有一个错误,您需要修复该错误才能使其正常工作。在 GZipMessageEncoderFactory 类中,CompressBuffer 方法中,以下行

ArraySegment<byte> byteArray = new ArraySegment<byte>(bufferedBytes, messageOffset, bufferedBytes.Length - messageOffset);

应替换为

ArraySegment<byte> byteArray = new ArraySegment<byte>(bufferedBytes, messageOffset, totalLength);

应用上述修复后,整个消息正文将被压缩。

为了检查压缩是否正确,您可以使用 Fiddler 中的 AutoDecode 选项。但是,只有当消息具有 Content-Encoding: gzip HTTP header 时,AutoDecode 才会解压缩该消息。

向 WCF 消息调用添加 HTTP header 并不是简单的事情,因为 WCF 被设计为与传输无关,并且 WCF 应用程序不应处理特定于某种传输方法的元素。

但是,出于此应用程序的目的,我可以使用以下代码来完成此操作:

public string Echo(string input)
{
    using (OperationContextScope opScope = new OperationContextScope((IContextChannel)base.Channel))
    {
        HttpRequestMessageProperty reqProps = new HttpRequestMessageProperty();
        reqProps.Headers["Content-Encoding"] = "gzip";
        OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = reqProps;

        return base.Channel.Echo(input);
    }
}

Echo 是 MSDN 示例中的客户端方法之一,在其中我正在访问当前操作上下文以添加 HTTP header 。

如果您需要其他帮助,请告诉我。

关于.net - 如何在传输级别压缩来自 WCF .NET 的 HTTP 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4416177/

相关文章:

c# - 使用 LINQ 在列表的列表中选择不同的属性

c# - 无法调用服务,WCF 测试客户端?

python - 在 Python 中压缩图像(无存档)

javascript - 为什么闭包编译器会覆盖短的 var ref。到 'this' 关键字并恢复 'this' ?

c# - 如何在 ASP.NET 中获取客户端日期和时间?

.net - WPF - 使用 MVVM 的对话框

asp.net - WCF 服务绑定(bind)设置

c# - RESTful 服务是否可以从客户端的 "Accept"属性设置其请求和响应类型

vb.net - vb.net 4.5 中的 Zipfile "The directory name is invalid."错误 - 无法确定原因?

.net - 对于 Linux mono 拒绝承认我已经调整了 VirtualMode ListView 的列的大小,是否有解决方法?