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

Joa*_*rel 7 .net compression wcf gzip httpwebrequest

我已经设法在ASP.NET上启用入站HTTP压缩(即压缩HTTP 请求,而不仅仅是响应),但我现在正在客户端(C#/ .NET 4.0应用程序)上苦苦挣扎.

我想要:

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

到WCF通道发出的所有出站HTTP请求.

到目前为止无效的解决方案:

  • IClientMessageInspector我可以压缩的消息,但由于信封没有压缩它并不占整个HTTP身体.
  • 对于自定义消息编码器,压缩消息而不是信封,对HTTP请求标头没有影响.

任何想法如何模仿IHttpModule客户端的行为(见初始响应)?

Flo*_*scu 5

这里描述的消息编码器应该完成这项工作.

我一直在使用从可用上述文章中的链接(在安装驱动\ WF_WCF_Samples\WCF \扩展\ MessageEncoder,具体\压缩从项目中下载的样本测试这个)和提琴手.

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

ArraySegment<byte> byteArray = new ArraySegment<byte>(bufferedBytes, messageOffset, bufferedBytes.Length - messageOffset);
Run Code Online (Sandbox Code Playgroud)

应该换成

ArraySegment<byte> byteArray = new ArraySegment<byte>(bufferedBytes, messageOffset, totalLength);
Run Code Online (Sandbox Code Playgroud)

应用上述修复后,将压缩整个邮件正文.

为了检查压缩是否正确,您可以使用Fiddler的AutoDecode选项.但是,如果消息具有Content-Encoding: gzipHTTP标头,则AutoDecode将仅解压缩该消息.

将HTTP标头添加到WCF消息调用并不是一个前沿,因为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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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