MVC 4 - JSON ajax 动作结果的 GZIP 压缩 [重复]

Posted

技术标签:

【中文标题】MVC 4 - JSON ajax 动作结果的 GZIP 压缩 [重复]【英文标题】:MVC 4 - GZIP compression of JSON ajax action result [duplicate] 【发布时间】:2015-04-30 03:00:17 【问题描述】:

问题

我在 IIS 7.5 上运行的 MVC 4 应用程序上有一个 Telerik MVC UI 网格,它可能通过 AJAX 返回大量 JSON 数据,在极端情况下为 800kb 或更多。由于有效负载可能很大,我想对其进行 GZIP 压缩。对于我的生活,我无法让它工作。

控制器动作是:

public ActionResult _CustomBinding([DataSourceRequest] DataSourceRequest request, SearchMemberModel search)

    //Do some stuff

   return Json(result);

提琴手报告:

什么都试过了

我已确保在 IIS 中启用了动态和静态压缩:

App Web.Config 修改:

  <system.webServer>
    <serverRuntime frequentHitThreshold="1" frequentHitTimePeriod="10:00:00" />

    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="false">
      <remove name="FormsAuthentication" />
    </modules>

    <httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">

      <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" staticCompressionLevel="9"  />
      <dynamicTypes>
        <add mimeType="text/*" enabled="true" />
        <add mimeType="message/*" enabled="true" />
        <add mimeType="application/x-javascript" enabled="true" />
        <add mimeType="application/json" enabled="true" />
        <add mimeType="*/*" enabled="false" />
      </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="*/*" enabled="false" />
      </staticTypes>
    </httpCompression>

    <urlCompression doStaticCompression="true" doDynamicCompression="true" />

  </system.webServer>

我已经确定ApplicationHost file has the right mime types:

    <add mimeType="application/json" enabled="true" />
    <add mimeType="application/json; charset=utf-8" enabled="true" />
    <add mimeType="application/json;charset=utf-8" enabled="true" />

我试过suggestion here serverRuntimefrequentHitThreshold 需要修改。

我有什么遗漏吗?

【问题讨论】:

但是考虑到浏览器请求10.0.0.10:70/Maps/FirstFloor.jpg,如何主要以png压缩图像。其中Maps 是一个文件夹 另外我还有一个问题,如果我的代码在开发机器上并且图像驻留在本地服务器上,它会影响开发和测试应用程序时的加载时间吗?? 【参考方案1】:

好的,看来我还需要在控制器中做一些事情:

根据以下摘录自:how to gzip content in asp.net MVC?

public class CompressAttribute : ActionFilterAttribute

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    

        var encodingsAccepted = filterContext.HttpContext.Request.Headers["Accept-Encoding"];
        if (string.IsNullOrEmpty(encodingsAccepted)) return;

        encodingsAccepted = encodingsAccepted.ToLowerInvariant();
        var response = filterContext.HttpContext.Response;

        if (encodingsAccepted.Contains("deflate"))
        
            response.AppendHeader("Content-encoding", "deflate");
            response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
        
        else if (encodingsAccepted.Contains("gzip"))
        
            response.AppendHeader("Content-encoding", "gzip");
            response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
        
    

在控制器中的使用:

[Compress]
public class BookingController : BaseController
...

【讨论】:

不错的答案!一些测试系统使用“狡猾的代理”来记录测试场景,并且它在放气压缩方面存在问题。在这种情况下,最好通过还原最后两个 if 语句来支持 gzip 放气。 这正是我要问的问题,谢谢@sep

以上是关于MVC 4 - JSON ajax 动作结果的 GZIP 压缩 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Ajax 获取 MVC Json 结果并填充到表中

如何构建ASP.NET MVC4&JQuery&AJax&JSon示例

如何取消 AJAX 长时间运行的 MVC 动作客户端(在 javascript 中)?

未使用 MVC 从 Json Result 获取 Ajax 成功方法中的 LINQ 连接查询结果,但结果显示正确

AJAX 调用 ASP MVC 动作

通过 json 结果 MVC 渲染 Html 部分视图