作者:游你精彩_980_469 | 来源:互联网 | 2023-08-16 10:59
最近一直被这个问题所困扰,现在想了一个方案,特贡献出来给大伙,技术不好,还请指教,如有更好的方法,还请告诉我,谢谢。
1 ///
2 /// 检查是否排除过滤器
3 ///
4 /// 方法执行上下文
5 ///
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 ///
2 /// 自定义比较方法
3 ///
4 /// 用户设置的排除过滤器的值
5 /// 当前所在页面的ActionName或ControllerName的值
6 ///
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 ///
2 /// 文件压缩特性
3 ///
4 public class CompressFilterAttribute : ActionFilterAttribute
5 {
6 private const CompressionMode compress = CompressionMode.Compress;
7
8 ///
9 /// 构造函数
10 ///
11 public CompressFilterAttribute()
12 {
13 }
14
15 ///
16 /// 执行压缩方法
17 ///
18 ///
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 ///
2 /// 注册全局过滤器
3 ///
4 ///
5 public static void RegistrationGlobalFilters(GlobalFilterCollection filter)
6 {
7 filter.Add(new HandleErrorAttribute());
8 filter.Add(new CompressFilterAttribute("Home", "Index"));
9 }
最后,我们来看看效果吧。
由于之前设置了,排除了Home控制器下的index方法,也就没有对页面进行GZIP压缩了。
这只是我自己想的一种方法,如果你有更好的方法,记得告诉我,谢谢。