全局过滤器中排除指定Controller和action方法

最近一直被这个问题所困扰,现在想了一个方案,特贡献出来给大伙,技术不好,还请指教,如有更好的方法,还请告诉我,谢谢。

 1   /// <summary>
 2         /// 检查是否排除过滤器
 3         /// </summary>
 4         /// <param name="filterContext">方法执行上下文</param>
 5         /// <returns></returns>
 6         public bool IsRemoveFilter(ActionExecutingContext filterContext)
 7         {
 8             bool check = false;
 9             string controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
10             if (this.RemoveActionName == null)
11             {
12                 check = CustomCompareStrings(RemoveControllerName, controllerName);
13             }
14             else
15             {
16                 string actionName = filterContext.ActionDescriptor.ActionName;
17                 if (CustomCompareStrings(RemoveControllerName, controllerName))
18                 {
19                     check = CustomCompareStrings(RemoveActionName, actionName);
20                 }
21             }
22             return check;
23         }

这其中,我自定义了一个比较方法,判断当前的控制器或者action方法是否设置了的排除对象。

 1  /// <summary>
 2         /// 自定义比较方法
 3         /// </summary>
 4         /// <param name="useSetValue">用户设置的排除过滤器的值</param>
 5         /// <param name="nowPageValue">当前所在页面的ActionName或ControllerName的值</param>
 6         /// <returns></returns>
 7         public bool CustomCompareStrings(string useSetValue, string nowPageValue)
 8         {
 9             string[] values;
10             if (useSetValue != null)
11             {
12                 if (useSetValue.Contains(','))
13                 {
14                     values = useSetValue.ToLower().Split(',');
15                     foreach (string value in values)
16                     {
17                         if (value == nowPageValue.ToLower())
18                         {
19                             return true;
20                         }
21                     }
22                 }
23                 else
24                 {
25                     if (useSetValue.ToLower() == nowPageValue.ToLower())
26                     {
27                         return true;
28                     }
29                 }
30             }
31             return false;
32         }

好了,开始运用在自定义过滤器中了。

 1     /// <summary>
 2     /// 文件压缩特性
 3     /// </summary>
 4     public class CompressFilterAttribute : ActionFilterAttribute
 5     {
 6         private const CompressionMode compress = CompressionMode.Compress;
 7 
 8         /// <summary>
 9         /// 构造函数
10         /// </summary>
11         public CompressFilterAttribute()
12         {
13         }
14 
15         /// <summary>
16         /// 执行压缩方法
17         /// </summary>
18         /// <param name="filterContext"></param>
19         public override void OnActionExecuting(ActionExecutingContext filterContext)
20         {
28             if (IsRemoveFilter(filterContext))
29             {
30                 filterContext.HttpContext.Response.Write("该页未执行GZIP压缩");
31                 return;
32             }
33 
34             HttpRequestBase request = filterContext.HttpContext.Request;
35             HttpResponseBase response = filterContext.HttpContext.Response;
36             string acceptEncoding = request.Headers["Accept-Encoding"].ToLower();
37 
38             if (string.IsNullOrEmpty(acceptEncoding))
39             {
40                 return;
41             }
42 
43             if (acceptEncoding.Contains("gzip"))
44             {
45                 response.Filter = new GZipStream(response.Filter, compress);
46                 response.AppendHeader("Content-Encoding", "gzip");
47             }
48             else if (acceptEncoding.Contains("deflate"))
49             {
50                 response.Filter = new DeflateStream(response.Filter, compress);
51                 response.AppendHeader("Content-Encoding", "deflate");
52             }
53         }
54 
55     }

 

接下来就是将我们的过滤器注册到全局过滤器中了。

1         /// <summary>
2         /// 注册全局过滤器
3         /// </summary>
4         /// <param name="filter"></param>
5         public static void RegistrationGlobalFilters(GlobalFilterCollection filter)
6         {
7             filter.Add(new HandleErrorAttribute());
8             filter.Add(new CompressFilterAttribute("Home", "Index"));
9         }

最后,我们来看看效果吧。 

由于之前设置了,排除了Home控制器下的index方法,也就没有对页面进行GZIP压缩了。 

这只是我自己想的一种方法,如果你有更好的方法,记得告诉我,谢谢。

posted @ 2013-03-19 10:36  虔城墨客  阅读(1556)  评论(0编辑  收藏  举报