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) 你有两个选择:
更改您的 applicationHost.config
并添加
到 httpCompression -> dynamicTypes 部分。
在您的网络 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"。
发送更多数据,它应该可以正常工作。
我添加了 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) 你有两个选择:
更改您的
applicationHost.config
并添加到 httpCompression -> dynamicTypes 部分。
在您的网络 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"。 发送更多数据,它应该可以正常工作。