Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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
如何在传输级别压缩来自WCF.NET的HTTP请求?_.net_Wcf_Compression_Httpwebrequest_Gzip - Fatal编程技术网

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

如何在传输级别压缩来自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请求,而不仅仅是响应),但我现在在客户端(C#/.NET 4.0应用程序)上苦苦挣扎

我想:

  • 添加HTTP头
    内容编码:gzip
  • 用GZip压缩HTTP正文
发送到WCF通道发出的所有出站HTTP请求

迄今为止,不起作用的解决方案

  • 使用
    IClientMessageInspector
    我可以压缩消息,但它不能解释整个HTTP正文,因为信封没有被压缩
  • 与自定义消息编码器相同,压缩消息而不是信封,对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);
    }
}