前文貼出了一種方式來排除Controller和action方法,但是感覺不太實用,因為如果遇到多個控制器,多個方法,就很難辨別了,今天我來介紹一種方式,加上標簽,這種方法比較簡單,相信你也會喜歡,麻煩的就是每個全局過濾器都要對應一個 不啟用該全局過濾器的標簽,不過為了功能實現,這點我們也暫時不去計較了吧。
首先,我們創建一個特性,內部什么都不用寫,只是當作一個標識,占位的標識:
1 /// <summary> 2 /// 不啟用壓縮特性 3 /// </summary> 4 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = false)] 5 public class NoCompress : Attribute 6 { 7 public NoCompress() 8 { 9 } 10 }
接着呢,在全局過濾器中把你要排除的控制器或者過濾器一一貼上此標簽。
1 [NoCompress] 2 public ActionResult Contact() 3 { 4 ViewBag.Message = "你的聯系方式頁。"; 5 6 return this.View(); 7 } 8 9 [NoCompress] 10 public ActionResult Grid() 11 { 12 return this.View(); 13 }
類似如此....
最后,就是寫過濾器了,以壓縮過濾器為例:
/// <summary> /// 執行壓縮方法 /// </summary> /// <param name="filterContext"></param> public override void OnActionExecuting(ActionExecutingContext filterContext) { object[] actionFilter = filterContext.ActionDescriptor.GetCustomAttributes(typeof(NoCompress), false); object[] controllerFilter = filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(typeof(NoCompress), false); if (controllerFilter.Length == 1 || actionFilter.Length == 1) { return; } HttpRequestBase request = filterContext.HttpContext.Request; HttpResponseBase response = filterContext.HttpContext.Response; string acceptEncoding = request.Headers["Accept-Encoding"].ToLower(); if (string.IsNullOrEmpty(acceptEncoding)) { return; } if (acceptEncoding.Contains("gzip")) { response.Filter = new GZipStream(response.Filter, compress); response.AppendHeader("Content-Encoding", "gzip"); } else if (acceptEncoding.Contains("deflate")) { response.Filter = new DeflateStream(response.Filter, compress); response.AppendHeader("Content-Encoding", "deflate"); } }
接着上文一樣,添加全局過濾器。
public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new CompressFilterAttribute()); }
好了,大功告成。