全局過濾器中排除指定Controller和action方法(二)


   前文貼出了一種方式來排除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());
        }

好了,大功告成。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM