全局过滤器中排除指定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压缩了。
这只是我自己想的一种方法,如果你有更好的方法,记得告诉我,谢谢。