十二个 ASP.NET Core 例子——过滤器

  目录:

  1. 过滤器介绍
  2. 过滤器类别
  3. 自定义过滤器和过滤特性
  4. 直接短路返回内容
  5. 过滤器与中间件的区别
  6. 如果要全局日志,不要用过滤器

  官方文档传送门


  1.过滤器介绍

  没有权限直接返回,资源缓存,Action执行前执行后过滤,异常定制化处理,结果定制化处理 等一些操作都可以用过滤器.而且能省去不少代码

  官方解释:ASP.NET Core MVC中的过滤器允许您在请求处理管道中的某些阶段之前或之后运行代码

     2.过滤器类别[直接引用官方解释]

  每个过滤器类型在过滤器管道中的不同阶段执行。

  • 授权过滤器首先运行,并用于确定当前用户是否被授权用于当前请求。如果请求未经授权,它们可能使管道短路。

  • 资源过滤器是第一个在授权后处理请求的过滤器。他们可以在过滤器管道的其余部分之前运行代码,并在管道的其余部分完成之后运行代码。出于性能原因,它们可用于实现缓存或以其他方式短路过滤器管道。因为它们在模型绑定之前运行,所以它们对于需要影响模型绑定的任何东西都是有用的。

  • 操作过滤器可以在调用单个操作方法之前和之后立即运行代码。它们可用于操作传递到操作中的参数,并从操作返回结果。

  • 异常过滤器用于将全局策略应用于任何事情已写入响应体之前发生的未处理异常。

  • 结果过滤器可以在执行单个操作结果之前和之后立即运行代码。只有当action方法成功执行并且对于必须围绕视图或格式化程序执行的逻辑有用时,它们才会运行

  3.自定义过滤器

  自定义过滤器两种方式.这里单独用action过滤器介绍

  a.继承IActionFilter实现自己的过滤器类,并且在sartUp,mvc服务中注入. 全局都会过滤,在任意一个action执行前和执行后都会过滤一次

  IActionFilter继承需要实现两个方法OnActionExecuted,OnActionExecuting,分别是动作执行前和动作执行后

  First:自定义过滤器类

    public class MyActionFilter : IActionFilter
    {
        public void OnActionExecuted(ActionExecutedContext context)
        {
            var s = "Filter_OnActionExecuted";
        }

        public void OnActionExecuting(ActionExecutingContext context)
        {
            var s = "Filter_OnActionExecuted";
        }
    }
View Code

  Second:注入

        public void ConfigureServices(IServiceCollection services)
        {
            // Add framework services.
            services.AddMvc(options =>
            {
                options.Filters.Add(new MyActionFilter());
            });
        }
View Code

  b.继承Attribute, IActionFilter,通过Attribute特性标识到想要过滤的地方实现局部过滤(controller,action)

  First:自定义过滤特性

    public class MyActionFilterAttribute : Attribute, IActionFilter
    {
        public void OnActionExecuted(ActionExecutedContext context)
        {
            var s = "Attribute_OnActionExecuted";
        }

        public void OnActionExecuting(ActionExecutingContext context)
        {
            var s = "Attribute_OnActionExecuting";
        }
    }
View Code

  Second:标注限制单个action过滤

        [MyActionFilter]
        public IActionResult Index()
        {
            return View();
        }
View Code

  Second:标注限制单个controller过滤

    [MyActionFilter]
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }

        public IActionResult About()
        {
            ViewData["Message"] = "Your application description page.";

            return View();
        }

        public IActionResult Contact()
        {
            ViewData["Message"] = "Your contact page.";

            return View();
        }

        public IActionResult Error()
        {
            return View();
        }
    }
View Code

 注意点:当你实现自定义过滤器注入后,又实现了该类别过滤器的特性.那么执行顺序是全局过滤器OnActionExecuting,再是特性OnActionExecuting,再是特性OnActionExecuted,最后是过滤器OnActionExecuted.

  4.直接短路返回内容 

 public class MyActionFilterAttribute : Attribute, IActionFilter
    {
        public void OnActionExecuted(ActionExecutedContext context)
        {
            context.Result = new ContentResult()
            {
                Content = "Resource unavailable - header should not be set"
            };
        }

        public void OnActionExecuting(ActionExecutingContext context)
        {
            var s = "Attribute_OnActionExecuting";
        }
    }
View Code

  只要返回ContentResult就会短路,后面的所有逻辑不会再处理

  5.过滤器与中间件的区别

  过滤器余中间件非常的像。引用文章地址。区别在于:同作为两个AOP利器,过滤器更贴合业务,它关注于应用程序本身,比如你看ActionFilter 和 ResultFilter,它都直接和你的Action,ActionResult交互了,是不是离你很近的感觉,那我有一些比如对我的输出结果进行格式化啦,对我的请求的ViewModel进行数据验证啦,肯定就是用Filter无疑了。它是MVC的一部分,它可以拦截到你Action上下文的一些信息,而中间件是没有这个能力的。

  6.如果要全局日志,不要用过滤器

  官方文档中表示。建议不要用过滤器来作为日志记录

  原因:避免创建和使用纯粹用于记录目的的过滤器,因为内置的框架记录功能可能已经提供您需要的。如果要将过滤器添加日志记录,则应将注意力集中在特定于过滤器的业务领域问题或行为上,而不是MVC操作或其他框架事件。

posted @ 2017-05-12 18:54  TeemoHQ  阅读(3389)  评论(0编辑  收藏  举报