如何在传输级别压缩来自WCF.NET的HTTP请求?
我已经设法做到了(即压缩HTTP请求,而不仅仅是响应),但我现在在客户端(C#/.NET 4.0应用程序)上苦苦挣扎 我想:如何在传输级别压缩来自WCF.NET的HTTP请求?,.net,wcf,compression,httpwebrequest,gzip,.net,Wcf,Compression,Httpwebrequest,Gzip,我已经设法做到了(即压缩HTTP请求,而不仅仅是响应),但我现在在客户端(C#/.NET 4.0应用程序)上苦苦挣扎 我想: 添加HTTP头内容编码:gzip 用GZip压缩HTTP正文 发送到WCF通道发出的所有出站HTTP请求 迄今为止,不起作用的解决方案: 使用IClientMessageInspector我可以压缩消息,但它不能解释整个HTTP正文,因为信封没有被压缩 与自定义消息编码器相同,压缩消息而不是信封,对HTTP请求头没有影响 知道如何在客户端模拟IHttpModule
- 添加HTTP头
内容编码:gzip
- 用GZip压缩HTTP正文
- 使用
我可以压缩消息,但它不能解释整个HTTP正文,因为信封没有被压缩IClientMessageInspector
- 与自定义消息编码器相同,压缩消息而不是信封,对HTTP请求头没有影响
知道如何在客户端模拟
IHttpModule
行为(参见初始响应)吗?所描述的消息编码器应该完成这项工作
我已经使用从上述文章中提供的链接下载的示例(来自的InstallDrive\WF\U WCF\U Samples\WCF\Extensibility\MessageEncoder\Compression项目)和Fiddler进行了测试
请注意,MSDN示例有一个bug,您需要修复该bug才能使其正常工作。在gzimpessageencoderfactory
类的CompressBuffer
方法中,以下行
ArraySegment<byte> byteArray = new ArraySegment<byte>(bufferedBytes, messageOffset, bufferedBytes.Length - messageOffset);
Echo是MSDN示例中的一种客户端方法,在它内部,我正在访问当前操作上下文以添加HTTP头
如果您需要其他帮助,请告诉我。我原以为您可以启用加密来实现压缩。我想我说得对,所有常见的加密算法也会压缩数据,以避免在压缩数据中产生明显的模式。作为一个副作用,您的服务将更加安全:)不是真正的直接答案(因此不是作为一个发布),但我会通过发送更少的字节来回避这一点——在我的例子中,通过将序列化程序换成更紧凑的内容(相同的数据;在线路上更小)(如果你想了解更多细节,请告诉我——这是一个我可以连续数小时谈论的话题)Marc,是的,不太详细的序列化程序也是一个选项。这种方法的一个好处是,它完全将压缩问题与消息编码分离,这与经典HTTP压缩对响应的效果非常相似。消息编码器与这里描述的一样吗?我本以为会有类似的效果。Florin,tr我试过了,但到目前为止,我无法让它在整个HTTP请求体中工作。
ArraySegment<byte> byteArray = new ArraySegment<byte>(bufferedBytes, messageOffset, totalLength);
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);
}
}