zoukankan      html  css  js  c++  java
  • 全局过滤器中排除指定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压缩了。 

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

  • 相关阅读:
    equals()与=的区别
    HashTable和HashMap的区别
    shell高级用法——磁盘管理 创建虚拟的磁盘映射到一个文件
    shell妙用之——dd命令合并多个烧录文件为一个flash镜像
    自动解包ROM 文件获取uboot,uboot-spl ,uImage, rootfs.tar.gz 并烧写SD卡
    运用层通过shell脚本直接操控gpio
    shell脚本之位运算+for循环+返回值承接+shell小数运算
    shell函数递归调用实现目录的对比拷贝
    用debootstrip制作debian环境的rootfs
    shell命令的高级使用之---选择性copy
  • 原文地址:https://www.cnblogs.com/yangda/p/2968655.html
Copyright © 2011-2022 走看看