代码之家  ›  专栏  ›  技术社区  ›  Gareth Saul

如何使用IIS 7.5从ASP.NET MVC压缩Json结果

  •  57
  • Gareth Saul  · 技术社区  · 15 年前

    我已经确定问题似乎与MimeType有关。当我包括 mimeType="*/*" ,我可以看出响应是正确的。如何让IIS在不使用通配符mimeType的情况下进行压缩?我假设这个问题与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>
    
    4 回复  |  直到 10 年前
        1
  •  61
  •   deerchao    10 年前

    确保你的 %WinDir%\System32\inetsrv\config\applicationHost.config

    <system.webServer>
        <urlCompression doDynamicCompression="true" />
        <httpCompression>
          <dynamicTypes>
            <add mimeType="application/json" enabled="true" />
            <add mimeType="application/json; charset=utf-8" enabled="true" />       
          </dynamicTypes>
        </httpCompression>
    </system.webServer>
    

    link

    正如@simon_weaver在评论中所说,您可能使用64位Windows上的32位编辑器编辑了错误的文件,请使用notepad.exe确保确实修改了此文件。

        2
  •  22
  •   Atanas Korchev    15 年前

    我已经成功地使用了强调的方法 here

        3
  •  14
  •   Hakan Fıstık MuriloKunze    8 年前

    Use this guide

    这些答案都不适合我。我确实注意到了这一点 应用程序/json;字符集=utf-8 mime类型。

        4
  •  7
  •   Hakan Fıstık MuriloKunze    8 年前

    我推荐 this approach
    创造 CompressAttribute 类,并设置目标操作。

        5
  •  0
  •   seagulledge    4 年前

    ActionFilterAttribute方法针对ASP.NET 4.x进行了更新,并包括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);
            }
        }
    }