我很难让IIS7正确地压缩来自ASP.NET MVC的Json结果。我已经在IIS中启用了静态和动态压缩。我可以用Fiddler验证正常的text/html和类似的记录是否被压缩。查看请求时,会显示accept-encoding gzip头。响应具有mimetype "application/json",但未压缩。
我已经确定这个问题似乎与MimeType有关。当我包含mimeType="*/*"
时,我可以看到响应是正确的gzipped压缩。如何在不使用通配符mimeType的情况下压缩IIS?我假设这个问题与ASP.NET MVC生成内容类型标头的方式有关。
CPU使用率远低于动态限制阈值。当我检查IIS中的跟踪日志时,可以看到由于找不到匹配的mime类型而导致无法压缩。
<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files" noCompressionForProxies="false">
<scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" />
<dynamicTypes>
<add mimeType="text/*" enabled="true" />
<add mimeType="message/*" enabled="true" />
<add mimeType="application/x-javascript" enabled="true" />
<add mimeType="application/json" enabled="true" />
</dynamicTypes>
<staticTypes>
<add mimeType="text/*" enabled="true" />
<add mimeType="message/*" enabled="true" />
<add mimeType="application/x-javascript" enabled="true" />
<add mimeType="application/atom+xml" enabled="true" />
<add mimeType="application/xaml+xml" enabled="true" />
<add mimeType="application/json" enabled="true" />
</staticTypes>
</httpCompression>
发布于 2010-01-26 16:52:24
我已经成功地使用了突出显示here的方法。
发布于 2010-01-26 23:26:08
创建CompressAttribute
类,并设置目标操作。
发布于 2020-11-09 09:04:36
针对ASP.NET 4.x更新了ActionFilterAttribute方法,并包含Brotli.NET包。
using System;
using System.IO.Compression;
using Brotli;
using System.Web;
using System.Web.Mvc;
public class CompressFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpRequestBase request = filterContext.HttpContext.Request;
string acceptEncoding = request.Headers["Accept-Encoding"];
if (string.IsNullOrEmpty(acceptEncoding)) return;
acceptEncoding = acceptEncoding.ToUpperInvariant();
HttpResponseBase response = filterContext.HttpContext.Response;
if (acceptEncoding.Contains("BR"))
{
response.AppendHeader("Content-encoding", "br");
response.Filter = new BrotliStream(response.Filter, CompressionMode.Compress);
}
else if (acceptEncoding.Contains("GZIP"))
{
response.AppendHeader("Content-encoding", "gzip");
response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
}
else if (acceptEncoding.Contains("DEFLATE"))
{
response.AppendHeader("Content-encoding", "deflate");
response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
}
}
}
https://stackoverflow.com/questions/2138243
复制相似问题