グローバルフィルタで指定したControllerとactionメソッドを除外する(2)

7679 ワード

前の文は1種の方式を貼ってControllerとactionの方法を排除して、しかしあまり実用的ではありませんて、もし多くのコントローラに出会って、多くの方法、識別しにくいならば、今日私は1種の方式を紹介して、ラベルを加えて、この方法は比較的に簡単で、あなたも好きになることを信じて、面倒なのは、グローバルフィルタごとにそのグローバルフィルタを有効にしないラベルに対応することですが、機能を実現するためには、しばらくは気にしないでください.
まず、内部には何も書かずに識別、占有の識別として機能します.
 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());

        }

よし、大功を成し遂げた.