Asp.net
ASP.NET MVC - 在 RegisterGlobalFilters() 中使用 ActionFilterAttribute 時,Response.Filter 為空
我想在我的網站上使用 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; ... } }