web-dev-qa-db-ja.com

MVC 4-JSONajaxアクション結果のGZIP圧縮

問題

IIS 7.5で実行されているMVC4アプリにTelerikMVC UIグリッドがあり、極端な場合は800kb以上のAJAX経由で大量のJSONデータを返す可能性があります。大きいので、GZIPしたいのですが、一生の間、動作させることができません。

コントローラのアクションは次のとおりです。

public ActionResult _CustomBinding([DataSourceRequest] DataSourceRequest request, SearchMemberModel search)
{
    //Do some stuff

   return Json(result);
}

フィドラーのレポート: enter image description here

試したこと

IISで動的および静的圧縮が有効になっていることを確認しました。

enter image description here

アプリの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ファイルに正しい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" />

私は ここでの提案 serverRuntimefrequentHitThresholdを修正する必要があることを試しました。

足りないものはありますか?

13
MagicalArmchair

さて、コントローラーでも何かをする必要があるようです。

以下から抽出したように: 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);
        }
    }

コントローラでの使用法:

[Compress]
public class BookingController : BaseController
{...}
25
MagicalArmchair