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),您有两种选择:
-
更改您的
applicationHost.config
并添加到httpCompression – > dynamicTypes部分。
-
在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中找到
另外在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
部分指定这些设置,否则请编辑
部分以允许从外部进行设置。
- 在Entity Framework支持的Web API 2 POST调用中返回一个对象以及409 Conflict错误?
- 从Web Api请求获取自定义validation错误消息到HttpClient
- 如何将Autofac与WepApi 2和Owin集成?
- 在Web API控制器中构建JSON响应
- 如何使用HttpClient从特定IP地址发送请求? C#
- 在返回json’d数据时卸载“急切加载”属性导致问题
- Web Web API中的严格映射(Over-Posting)
- Web Api Controller在其他项目中,路由属性不起作用
- DB-First与ASP.NET Web API 2 + EF6的身份validation混淆