我已经成功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/