.net core webapi教程-IActionFilter使用详解
深山老妖浏览:10752023-12-02 23:08:58本文累计收益:0我也要赚钱

IActionFilter过滤器主要用于日志记录,实现方式首页创建一个类继承自Attribute, IActionFilter,并实现IActionFilter接口的OnActionExecuting、OnActionExecuted两个方法,OnActionExecuting方法在Action执行前执行,OnActionExecuted在Action执行后执行。

具体代码实例如下:创建CustomLogActionFilterAttribute类继承自Attribute, IActionFilter方法,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class CustomLogActionFilterAttribute : Attribute, IActionFilter
    {
        private readonly ILogger<CustomLogActionFilterAttribute> _ILogger;
        public CustomLogActionFilterAttribute(ILogger<CustomLogActionFilterAttribute> iLogger) {
            this._ILogger = iLogger;
        }
        /// <summary>
        /// action执行之前
        /// </summary>
        /// <param name="context"></param>
        public void OnActionExecuting(ActionExecutingContext context)
        {
            //获取url参数
            var para = context.HttpContext.Request.QueryString.Value;
            //获取路由中的controller
            var controllerName = context.HttpContext.GetRouteValue("controller");
            //获取路由中的action
            var actionName = context.HttpContext.GetRouteValue("action");
            _ILogger.LogInformation($"执行{controllerName}控制器{actionName}方法:参数为:{para}");
        }
        public void OnActionExecuted(ActionExecutedContext context)
        {
            //获取返回结果
            var result = Newtonsoft.Json.JsonConvert.SerializeObject(context.Result);
            //获取路由中的controller
            var controllerName = context.HttpContext.GetRouteValue("controller");
            //获取路由中的action
            var actionName = context.HttpContext.GetRouteValue("action");
            _ILogger.LogInformation($"执行{controllerName}控制器{actionName}方法:执行结果为:{result}");
        }
    }

controller代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class FirstController : Controller
    {
        private readonly ILogger<FirstController> _Logger;
        private readonly ILoggerFactory _LoggerFactory;
        public FirstController(ILogger<FirstController> logger) {
            this._Logger = logger;
            this._Logger.LogInformation($"{this.GetType().Name}被构造了");
        }
        [TypeFilter(typeof(CustomLogActionFilterAttribute))]
        //[ServiceFilter(typeof(CustomLogActionFilterAttribute))]
        public IActionResult Index(int id)
        {
            ViewBag.user = Newtonsoft.Json.JsonConvert.SerializeObject(new {
                Id=id,
                Name = "Guandebao--ViewBag",
                Age=34
            });
            ViewData["UserInfo"] = Newtonsoft.Json.JsonConvert.SerializeObject(new
            {
                Id = id,
                Name = "Guandebao--ViewData",
                Age = 34
            });
            object description = "欢迎大家";
            this._Logger.LogInformation($"index被执行了");
            return View(description);
        }
    }

通过/First/Index?id=123访问测试以上代码,执行顺序如下:CustomLogActionFilterAttribute类的构造方法》FirstController构造方法》OnActionExecuting方法》Index Action方法》OnResourceExecuted方法。

OnActionExecuted代码中var result = Newtonsoft.Json.JsonConvert.SerializeObject(context.Result);返回结果如下:

1
{"StatusCode":null,"ViewName":null,"Model":"欢迎大家","ViewData":{"user":"{\"Id\":123,\"Name\":\"Guandebao--ViewBag\",\"Age\":34}","UserInfo":"{\"Id\":123,\"Name\":\"Guandebao--ViewData\",\"Age\":34}"},"TempData":{},"ViewEngine":null,"ContentType":null}

最后写入日志内容如下,写入日志文章介绍见(.net 6中使用log4net写文本日志):

2022-08-04 09:17:23,736 [74] INFO  TestCore.Controllers.FirstController - FirstController被构造了
2022-08-04 09:17:24,313 [74] INFO  TestCore.Utility.Filters.CustomLogActionFilterAttribute - 执行First控制器Index方法:参数为:?id=123
2022-08-04 09:17:24,946 [74] INFO  TestCore.Controllers.FirstController - index被执行了
2022-08-04 09:17:25,641 [74] INFO  TestCore.Utility.Filters.CustomLogActionFilterAttribute - 执行First控制器Index方法:执行结果为:{"StatusCode":null,"ViewName":null,"Model":"欢迎大家","ViewData":{"user":"{\"Id\":123,\"Name\":\"Guandebao--ViewBag\",\"Age\":34}","UserInfo":"{\"Id\":123,\"Name\":\"Guandebao--ViewData\",\"Age\":34}"},"TempData":{},"ViewEngine":null,"ContentType":null}

评论列表
发表评论
+ 关注