我有一个WebAPI控制器返回一个HttpResponseMessage,我想添加gzip压缩.这是服务器代码:
using System.Net.Http;
using System.Web.Http;
using System.Web;
using System.IO.Compression;
[Route("SomeRoute")]
public HttpResponseMessage Post([FromBody] string value)
{
HttpContext context = HttpContext.Current;
context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
HttpContext.Current.Response.AppendHeader("Content-encoding", "gzip");
HttpContext.Current.Response.Cache.VaryByHeaders["Accept-encoding"] = true;
return new SomeClass().SomeRequest(value);
}
Run Code Online (Sandbox Code Playgroud)
这是使用jquery的ajax调用的客户端代码:
$.ajax({
url: "/SomeRoute",
type: "POST",
cache: "false",
data: SomeData,
beforeSend: function (jqXHR) { jqXHR.setRequestHeader('Accept-Encoding', 'gzip'); },
success: function(msg) { ... }
Run Code Online (Sandbox Code Playgroud)
当我运行它时,服务器代码返回没有错误,但客户端错误:
(failed)
net::ERR_CONTENT_DECODING_FAILED
Run Code Online (Sandbox Code Playgroud)

当我和Fiddler一起看时,这就是我所看到的:

我需要更改什么才能使Web服务返回客户端正常处理的gzip压缩内容?我知道我也可以使用HttpModule或通过IIS上的某些设置来执行此操作,但这两个选项都不适合托管的情况:

请注意,我不是在寻找IIS设置,因为我无权访问(托管).
每个人,就我而言,这个问题都是在EDIT 2中进行的.尽管这只是问题的IIS方面的部分解决方案,但这正是我所寻求的.
因此,我将把我的问题添加到有关该主题的小问题上.
我正在尝试对来自WCF服务的大型soap响应启用GZip压缩.到目前为止,我已经按照这里和其他各种地方的说明在IIS上启用动态压缩.这是applicationHost.config中的dynamicTypes部分:
<dynamicTypes>
<add mimeType="text/*" enabled="true" />
<add mimeType="message/*" enabled="true" />
<add mimeType="application/x-javascript" enabled="true" />
<add mimeType="application/atom+xml" enabled="true" />
<add mimeType="application/xaml+xml" enabled="true" />
<add mimeType="application/xop+xml" enabled="true" />
<add mimeType="application/soap+xml" enabled="true" />
<add mimeType="*/*" enabled="false" />
</dynamicTypes>
Run Code Online (Sandbox Code Playgroud)
并且:
<urlCompression doDynamicCompression="true" doStaticCompression="true" />
Run Code Online (Sandbox Code Playgroud)
虽然我不清楚为什么需要这样做.
为了以防万一,在那里扔了一些额外的哑剧类型.我已经实现了IClientMessageInspector来添加Accept-Encoding:gzip,deflate到我的客户端的HttpRequests.这是一个从fiddler获取的请求标头的示例:
POST http://[omitted]/TestMtomService/TextService.svc HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Accept-Encoding: gzip, deflate
Host: [omitted]
Content-Length: 542
Expect: 100-continue
Run Code Online (Sandbox Code Playgroud)
现在,这不起作用.无论消息大小如何(尝试高达1.5Mb),都不会发生压缩.我看过这篇文章,但没有像他描述的那样遇到异常,所以我没有尝试过他提出的CodeProject实现.此外,我已经看到许多其他实现应该让它工作,但无法理解它们(例如,msdn的GZip编码器).为什么我需要实现编码器或代码项目解决方案?IIS不应该负责压缩吗?
那么我需要做些什么才能让它发挥作用?
乔尼
编辑:我认为WCF绑定可能值得发布,但我不确定它们是否相关(这些是来自客户端):
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WsTextBinding" closeTimeout="00:01:00" openTimeout="00:01:00"
receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" …Run Code Online (Sandbox Code Playgroud)