C# 未应用Web API Gzip
我已经添加了web.config条目,以基于这个S/O答案启用gzip压缩 然后,我在加载ASPX页面时检查了Chrome Developer窗口,并在响应中看到了标题:C# 未应用Web API Gzip,c#,gzip,asp.net-web-api2,C#,Gzip,Asp.net Web Api2,我已经添加了web.config条目,以基于这个S/O答案启用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 Va
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答案中推荐的配置开始)。最后,在绝望的情况下,我将其设置为此,我认为这将使其尝试压缩所有请求(除*/*注释外的所有请求):
,并在IIS Express 8.0(Visual Studio)和本地安装的IIS 7.5中编辑applicationHost.config。所有这些都产生了相同的结果:对其他mime类型(如text/*work)的请求都有效,但application/json拒绝gzip。根据您的说法,有两种选择:
更改applicationHost.config
并添加
到httpCompression->dynamicTypes部分
在web api管道中使用委派处理程序来处理压缩。
e、 g.或
WebAPI是否位于防火墙、Web代理、病毒防护套件之后?如中所述
这可能会剥离标题。在实现NuGet软件包Microsoft.AspNet.WebApi.MessageHandlers.Compression时,是否将必需的行(以下)添加到应用程序\u Start\WebApiConfig.cs文件中?请注意,根据包的主站点上的说明,is必须位于同一方法中的所有其他消息处理程序之后
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()));
}
这是我提到的博客帖子:我想你已经在服务器端完成了所有的作业,但问题在于请求
要允许服务器压缩响应,有必要在请求中包含此头文件:
Accept-Encoding: gzip, deflate
如果不这样做,无论在服务器端做什么,响应都不会被压缩
您没有指定哪一个是Web API客户端,但总有一种方法可以使用客户端API在请求中添加头。我认为@Peeticus的做法是正确的
以下是我所做的工作:
运行“安装包Microsoft.AspNet.WebApi.MessageHandlers.Compression”或通过GUI添加后,需要更新/App\u 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中,在默认值之前找到
也可以在applicationHost.config中更新到
多亏了上述两种解决方案和其他解决方案,我想逐步解释如何使用Web API 2.2实现http压缩可能会有所帮助,因为自上述文章发布以来,一些包/名称空间已经发生了变化
1) 使用nuget package manager控制台安装以下内容:
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内部,添加到寄存器底部(HttpConfiguration config)
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类型添加到
部分
(或者只是为了测试它,就像您所做的那样
)
但是
默认情况下,
节被IIS锁定,用于外部设置
因此,您在web.config上指定的任何设置都将被忽略
除非您在applicationHost.config
部分或
编辑
部分以允许从外部进行设置
<section name="httpCompression" allowDefinition="MachineToApplication" overrideModeDefault="Allow" />
您看到的问题是,由于文档中说明,小于860字节的响应未被压缩,并且您的示例显示“内容长度:551”。
发送更多数据,它应该可以正常工作。在构建应用程序时,您是否将web.config设置为始终复制到输出目录?是的,新条目肯定存在。没有防火墙。我通过IIS Express 8(即Visual Studio)中的localhost在本地和IIS 7.5上进行了所有尝试,并在同一网络上的服务器上进行了IIS 7.5本地和IIS 7.5的所有尝试。好的,结果证明我错了。在同一台开发人员计算机上,有一个完整的IIS安装正在运行应用程序请求路由,该应用程序请求路由充当反向代理,以允许本地环境之外的计算机命中该IIS,然后将请求转发到本地IIS Express实例(不允许外部连接)。尽管我在尝试启用gzip时对本地实例进行了大部分测试,但完整IIS中的路由条目位于web.config(同一目录)中。删除该web.config条目使NuGet gzip变得栩栩如生。谢谢-对我来说,这是ESET AntiVirus在内部解压缩所有响应。解决方案是禁用“web扫描器”模块。我已通过IIS Express 8.0和IIS 7.5在本地尝试了applicationHost.config。我还没有在我们的开发服务器(IIS 7.5)上尝试过它。我确实引入、配置和部署了NuGet包(本地和开发服务器)。都有相同的结果
GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new ServerCompressionHandler(new GZipCompressor(), new DeflateCompressor()));
<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>
application/json; charset=utf-8
<section name="httpCompression" allowDefinition="MachineToApplication" overrideModeDefault="Allow" />