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}
- .net core webapi教程-Swagger请求参数设置默认值(1686)
- .net core webapi教程-设置返回Json格式与Model大小写一致(1157)
- .net core webapi教程-设置日期型字段返回Json格式(1121)
- .net core webapi教程-IActionFilter使用详解 (1075)
- .net core webapi教程-配置 Swagger 显示接口注释及描述信息(1056)
- .net core webapi教程-Swagger请求参数通过属性特性设置默认值(922)
- .net core webapi教程-Filter全局注册、控制器注册如何排除某些Action方法使其不生效(857)
- .net core webapi教程-IExceptionFilter、IAsyncExceptionFilter使用详解 (841)
- .net core webapi教程-使用log4net写文本日志(772)
- .net core webapi教程-使用log4net写sqlserver数据库日志 (702)
- 1. Windows Server 2008 R2永久激活及Chew-WGA v0.9下载(12738)
- 2.Visual Studio 2017中安装visualSVN及使用详解(4861)
- 3.完美解决iis下JWplayer提示Error loading media: File could not be played错误(3756)
- 4.asp.net mvc+jquery easyui开发基础(一)模块首页及增加、修改、删除模块实现(2978)
- 5.Android avax.net.ssl.SSLPeerUnverifiedException: No peer certificate 解决方法(httpClient支持HTTPS的访问方式)(2828)
- 6..Net Mvc中使用Jquery EasyUI控件讲解(一)表格控件datagrid使用介绍(2689)
- 7.asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发(三)登录模块开发(2592)
- 8.asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发(七)权限管理模块之系统菜单动态生成(2559)
- 9. asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发(六)权限管理模块之初始数据准备(2207)
- 10.asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发(八)权限管理模块之权限管理实现(2175)