Asp.net

ASP.NET MVC - 在 RegisterGlobalFilters() 中使用 ActionFilterAttribute 時,Response.Filter 為空

  • July 31, 2013

我想在我的網站上使用 G-ZIP,我用Google搜尋了以下程式碼:

public class CompressAttribute : ActionFilterAttribute
{
   public override void OnActionExecuting(ActionExecutingContext filterContext)
   {
       var acceptEncoding = filterContext.HttpContext.Request.Headers["Accept-Encoding"];
       if (!string.IsNullOrEmpty(acceptEncoding))
       {
           acceptEncoding = acceptEncoding.ToLower();
           var response = filterContext.HttpContext.Response;
           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);
           }
       }
   }
}

當我將屬性設置為控制器或動作時,它工作正常。

[Compress]
public class PostController : Controller

我不想在每段程式碼上手動執行此操作,所以我在

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
   filters.Add(new HandleErrorAttribute());
   filters.Add(new CompressAttribute());
}

但是當我執行應用程序時,這行程式碼出現了異常:

response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);

response.Filter 為空。

我想知道為什麼會發生這種情況以及如何解決這個問題。謝謝!

- 更新:

我發現只有當控制器包含子操作並且它被呼叫時才會發生異常。

我的解決方案是過濾所有子動作。

if (filterContext.IsChildAction) return;

在您的方法頂部使用此程式碼。

public class CompressAttribute : ActionFilterAttribute
{    
  public override void OnActionExecuting(ActionExecutingContext filterContext)
  {
      if (filterContext.IsChildAction) return;

      ...
   }
}

引用自:https://stackoverflow.com/questions/15067049