MVC 4 - GZIP压缩JSON ajax动作结果

Mag*_*air 13 c# iis model-view-controller json gzip

问题

我在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);
}
Run Code Online (Sandbox Code Playgroud)

提琴手报道: 在此输入图像描述

已经尝试过什么

我确保在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>
Run Code Online (Sandbox Code Playgroud)

我确保ApplicationHost文件具有正确的mime类型:

    <add mimeType="application/json" enabled="true" />
    <add mimeType="application/json; charset=utf-8" enabled="true" />
    <add mimeType="application/json;charset=utf-8" enabled="true" />
Run Code Online (Sandbox Code Playgroud)

我在这里尝试过serverRuntime的frequencyHitThreshold需要修改的建议.

有什么我想念的吗?

Mag*_*air 25

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

根据以下摘录:如何在asp.net MVC中gzip内容?

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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

控制器中的用法:

[Compress]
public class BookingController : BaseController
{...}
Run Code Online (Sandbox Code Playgroud)

  • 不错的答案!一些测试系统使用“狡猾的代理”来记录测试场景,它在压缩压缩方面存在问题。在这种情况下,最好通过恢复最后两个 if 语句来支持 gzip 来放气。 (2认同)