Web API 未应用 Gzip

Web API Gzip not being applied

我添加了 web.config 条目以根据此 S/O 答案启用 gzip 压缩 Enable IIS7 gzip

然后我在加载 ASPX 页面时检查了 Chrome 开发人员 window,并在响应中看到了 header:

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

也就是说 "working",对吗?但是在进行 Web API 调用时查找 header 时,它不存在:

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 答案中推荐的配置开始)。最后,在绝望的情况下,我将它设置为这个,我认为这会让它尝试压缩 all 请求(除 */* 之外的所有内容都被注释掉):

  <httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/>
    <dynamicTypes>
      <add mimeType="*/*" enabled="true"/>
      <!--<add mimeType="text/*" enabled="true"/>
      <add mimeType="message/*" enabled="true"/>
      <add mimeType="application/javascript" enabled="true"/>
      <add mimeType="application/json" enabled="true"/>-->
      <!--<add mimeType="*/*" enabled="false"/> -->
    </dynamicTypes>
    <staticTypes>
      <add mimeType="*/*" enabled="true"/>
      <!--<add mimeType="text/*" enabled="true"/>
      <add mimeType="message/*" enabled="true"/>
      <add mimeType="application/javascript" enabled="true"/>
      <add mimeType="application/json" enabled="true"/>-->
      <!-- add mimeType="*/*" enabled="false"/>-->
    </staticTypes>
  </httpCompression>
  <urlCompression doStaticCompression="true" doDynamicCompression="true"/>

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

更新

从那以后,我尝试了 NuGet Web API Compression package,并在 IIS Express 8.0 (Visual Studio) 和 locally-installed IIS 7.5 中编辑了 applicationHost.config。所有结果都相同:对其他 MIME 类型(如 text/* )的请求有效,但 application/json 拒绝压缩。

根据 ASP.NET Web API Compression (Ben Foster Blog) 你有两个选择:

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

    到 httpCompression -> dynamicTypes 部分。

  2. 在您的网络 api 管道中使用委托处理程序来处理压缩。
    例如Fabrik.Common or Microsoft ASP.NET Web API Compression Support

WebAPI 是否在防火墙、Web 代理、病毒防护套件之后?正如Even Faster Web Sites: Performance Best Practices for Web Developers By Steve Souders中提到的 这可能会删除 headers.

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

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

这是我在博客中使用的来自 WebApiConfig 文件的注册方法示例:

    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()));
    }

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

我想你已经在服务器端做了所有的功课,但问题出在请求上。

要允许服务器压缩响应,需要 在请求中包含此 header:

Accept-Encoding: gzip, deflate

如果你不这样做,无论你在服务器端做什么,响应都不会被压缩。

您没有指定哪个是您的 Web API 客户端,但总有一种方法可以使用客户端 API.[=11 在请求中添加 headers =]

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

以下是我为让它发挥作用所做的工作:

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

需要以下额外的 using 语句:

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 中找到 元素和默认值之前的以下内容

<add mimeType="application/json" enabled="true" />

也在 applicationHost.config 中将 更新为

<urlCompression doDynamicCompression="true" />

多亏了上面的 2 个解决方案和其他地方的其他解决方案,我想出了一个关于如何让 http 压缩与 Web API 一起工作的逐步解释 API 2.2 可能是有益的,因为一些 packages/namespaces 已经改变自从以上帖子。

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 内添加;

<urlCompression doStaticCompression="true" doDynamicCompression="true" dynamicCompressionBeforeCache="true" />
<httpCompression>
    <dynamicTypes>
        <clear />
        <add enabled="true" mimeType="text/*" />
        <add enabled="true" mimeType="message/*" />
        <add enabled="true" mimeType="application/x-javascript" />
        <add enabled="true" mimeType="application/javascript" />
        <add enabled="true" mimeType="application/json" />
        <add enabled="false" mimeType="*/*" />
        <add enabled="true" mimeType="application/atom+xml" />
    </dynamicTypes>
    <staticTypes>
        <clear />
        <add enabled="true" mimeType="text/*" />
        <add enabled="true" mimeType="message/*" />
        <add enabled="true" mimeType="application/javascript" />
        <add enabled="true" mimeType="application/atom+xml" />
        <add enabled="true" mimeType="application/xaml+xml" />
        <add enabled="true" mimeType="application/json" />
        <add enabled="false" mimeType="*/*" />
    </staticTypes>
</httpCompression>

第一次在本地网站和 Azure 网站上工作,希望对您有用!另外当然不需要搞乱 applicationHost.config...

起初。

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

application/json; charset=utf-8

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

因此您必须将此 mime 类型添加到 <dynamicTypes> 部分

<add mimeType="application/json; charset=utf-8" enabled="true" />

(或者只是为了测试它,就像你做的那样<add mimeType="*/*" enabled="true" />

但是

默认情况下<httpCompression> 部分被 IIS 锁定以进行外部设置!!

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

除非您在 applicationHost.config <httpCompression> 部分指定这些设置或 编辑 <httpCompression> 部分以允许外部设置。

<section name="httpCompression" allowDefinition="MachineToApplication" overrideModeDefault="Allow" />

您看到的问题是因为如文档所述 https://github.com/azzlack/Microsoft.AspNet.WebApi.MessageHandlers.Compression 未压缩小于 860 字节的响应,而您的示例显示 "Content-Length:551"。 发送更多数据,它应该可以正常工作。