zoukankan      html  css  js  c++  java
  • ASP.Net Core Web API中的IActionFilter总结

    本文简要介绍了ASP.Net Core Web API中的IActionFilter,对其调用顺序、特性标记、注册方法进行总结。具体环境为:VS2019 + ASP.Net Core 3.1。

    1、IActionFilter调用顺序

    在调用控制器(Controller)构造函数之后调用Filter;

    在接口调用之前调用IActionFilter的OnActionExecuting方法,

    在接口调用之后调用IActionFilter的OnActionExecuted方法。

    2、特性标记

    (1)直接使用特性标记

    使用这种方式要求IActionFilter子类具有无参构造函数。

    [HttpGet]
    [Route("Info")]
    [CustomActionFilterAttribute]
    public string Info()
    {
    	return "test info";
    }
    

    (2)使用TypeFilter特性

    在这种方式中,IActionFilter子类的构造函数可以注入一些服务,并且不需要在Startup中注入Filter服务。

    [HttpGet]
    [Route("Info")]
    [TypeFilter(typeof(CustomLogActionFilterAttribute))]
    public string Info()
    {
    	return "test info";
    }
    

    (3)使用ServiceFilter特性

    在这种方式中,IActionFilter子类的构造函数可以注入一些服务,但是需要在Startup中注入Filter服务。

    [HttpGet]
    [Route("Info")]
    [ServiceFilter (typeof(CustomLogActionFilterAttribute))]
    public string Info()
    {
    	return "test info";
    }
    
    //注册ActionFilter服务
    services.AddSingleton<CustomLogActionFilterAttribute>();
    

    3、注册方法(使用方法)

    (1)方法注册

    [HttpGet]
    [Route("Info")]
    [ServiceFilter (typeof(CustomLogActionFilterAttribute))]
    public string Info()
    {
    	return "test info";
    }
    

    (2)控制器注册

    [Route("api/[controller]")]
    [ApiController]
    [ServiceFilter(typeof(CustomLogActionFilterAttribute))]
    public class FilterController : ControllerBase
    {
    }
    

    (3)全局注册

    //注册Filter服务
    services.AddSingleton<CustomLogActionFilterAttribute>();
    
    //全局注册Filter
    services.AddMvc(options =>
    {
    	options.Filters.Add(typeof(CustomLogActionFilterAttribute));
    });
    

    (4)注意事项

    如果同时使用方法注册、控制器注册、全局注册,那么对应的调用顺序为:

    全局Filter OnActionExecuting->
    控制器Filter OnActionExecuting->
    方法Filter OnActionExecuting->
    执行API方法->
    方法Filter OnActionExecuted->
    控制器Filter OnActionExecuted->
    全局Filter OnActionExecuted
    

    OnActionExecuting(全局->控制器->方法) ->
    执行API方法 ->
    OnActionExecuted(方法->控制器->全局)
    
  • 相关阅读:
    BZOJ1912 [Apio2010]patrol 巡逻
    BZOJ2432 [Noi2011]兔农
    BZOJ1010 [HNOI2008]玩具装箱toy
    BZOJ3240 [Noi2013]矩阵游戏
    洛谷【P1303】A*B Problem
    洛谷【2142】高精度减法
    洛谷【P1100】高低位交换
    OIer应该知道的二进制知识
    洛谷【P3908】异或之和
    洛谷【P2431】正妹吃月饼
  • 原文地址:https://www.cnblogs.com/xhubobo/p/14416212.html
Copyright © 2011-2022 走看看