Web API Gzip未被应用

我添加了web.config条目以启用基于此S / O答案启用IIS7 gzip的 gzip压缩。

然后我在加载ASPX页面时检查了Chrome Developer窗口,并在响应中看到了标题:

Cache-Control:private Content-Encoding:gzip Content-Length:3669 Content-Type:text/html; charset=utf-8 Date:Wed, 04 Mar 2015 00:46:05 GMT Server:Microsoft-IIS/7.5 Vary:Accept-Encoding X-AspNet-Version:4.0.30319 X-Powered-By:ASP.NET 

这意味着它“正常”,对吗? 但是在进行Web API调用时查找该标头时,它不存在:

 Cache-Control:no-cache Content-Length:551 Content-Type:application/json; charset=utf-8 Date:Wed, 04 Mar 2015 00:53:05 GMT Expires:-1 Pragma:no-cache Server:Microsoft-IIS/7.5 X-AspNet-Version:4.0.30319 X-Powered-By:ASP.NET 

我尝试了各种不同的配置(从上面链接的S / O答案中推荐的配置开始)。 最后,在一个绝望的行为中,我将它设置为这个,我认为它会尝试压缩所有请求(除了* / *注释掉的所有内容):

      <!--   --> <!-- -->    <!--   -->     

什么可以阻止GZIP应用于我的Web API方法?

更新

我已经尝试过NuGet Web API压缩包 ,并在IIS Express 8.0(Visual Studio)和本地安装的IIS 7.5中编辑applicationHost.config。 所有都产生了相同的结果:对text / *等其他mime类型的请求工作,但application / json拒绝被gzip压缩。

WebAPI是否位于防火墙,Web代理,病毒防护套件之后? 正如在更快的网站中所提到的:Web开发人员的性能最佳实践作者:Steve Souders这可能会剥离标题。

根据ASP.NET Web API压缩(Ben Foster Blog),您有两种选择:

  1. 更改您的applicationHost.config并添加

    到httpCompression – > dynamicTypes部分。

  2. 在Web api管道中使用委派处理程序来处理压缩。
    例如Fabrik.Common或Microsoft ASP.NET Web API压缩支持

我认为你已经完成了服务器端的所有功课,但问题出在请求中。

要允许服务器压缩响应,必须在请求中包含此标头

 Accept-Encoding: gzip, deflate 

如果不这样做,无论您在服务器端执行什么操作,都不会压缩响应。

您没有指定哪个是您的Web API客户端,但始终有一种方法可以使用客户端API在请求中添加标头。

我认为@Peeticus走在了正确的轨道上。

这是我做的工作:

运行“Install-Package Microsoft.AspNet.WebApi.MessageHandlers.Compression”或通过GUI添加它后,您需要更新/App_Start/WebApiConfig.cs

需要以下附加使用声明:

 using Microsoft.AspNet.WebApi.MessageHandlers.Compression.Compressors; using Microsoft.AspNet.WebApi.MessageHandlers.Compression; 

在WebApiConfig.Register方法中添加以下内容:

 GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new ServerCompressionHandler(new GZipCompressor(), new DeflateCompressor())); 

接下来在IISExpress applicationHost.config中找到元素以及默认值/ ”enabled =“false”/>之前的以下内容

  

另外在applicationHost.config中更新

  

感谢上面的2个解决方案和其他地方的其他解决方案,我想通过一步一步解释如何使用Web API 2.2进行http压缩可能是有益的,因为自上面的post以来,一些包/命名空间已经改变。

1)使用nuget包管理器控制台安装以下内容;

 Install-Package Microsoft.AspNet.WebApi.MessageHandlers.Compression 

2)在WebApiConfig.cs里面添加这些用法;

 using System.Net.Http.Extensions.Compression.Core.Compressors; using Microsoft.AspNet.WebApi.Extensions.Compression.Server; 

3)在WebApiConfig.cs里面添加Register(HttpConfiguration config)的底部;

 GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new ServerCompressionHandler(new GZipCompressor(), new DeflateCompressor())); 

4)编辑你的web.config并在system.webServer中添加;

                        

第一次在本地和azure色的网站上工作,所以希望它适合你! 加上当然不需要乱用applicationHost.config ……

在您的NuGet包Microsoft.AspNet.WebApi.MessageHandlers.Compression的实现中,您是否在App_Start \ WebApiConfig.cs文件中添加了必需的行(如下所示)? 请注意,必须在该方法中的所有其他消息处理程序之后,根据程序包主页上的说明。

 GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new ServerCompressionHandler(new GZipCompressor(), new DeflateCompressor())); 

这是我在博客中使用的WebApiConfig文件中的Register方法示例:

  public static void Register(HttpConfiguration config) { // Web API configuration and services // Web API routes config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { echo = RouteParameter.Optional } ); GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new ServerCompressionHandler(new GZipCompressor(), new DeflateCompressor())); } 

这是我提到的博客文章: .Net Web API Compression

首先。

IIS忽略WEB API响应压缩,因为Web api响应属于mime类型

 application/json; charset=utf-8 

默认的IIS压缩设置不包含此Mime类型,因此它们不会压缩响应。

所以你必须将这个mime类型添加到部分

(或者只是为了测试它,就像你一样

默认部分被IIS锁定,用于外部设置!!

因此,您在web.config上指定的任何设置都将被忽略

除非您在applicationHost.config 部分指定这些设置,否则请编辑部分以允许从外部进行设置。