目录
一:说明
IActionFilter同步过滤器与IAsyncActionFilter异步过滤器常常被用作于日志。
IActionFilter同步过滤器执行顺序:
1:执行控制器中的构造函数,实例化控制器
2:执行ActionFilter.OnActionExecuting方法
3:执行具体的Action方法
4:执行ActionFilter.OnActionExecuted方法
IActionFilter同步过滤器与IAsyncActionFilter异步过滤器搭配Log4Net或NLog效果更佳。
二:IActionFilter同步
控制器代码:
/// <summary>
/// Get请求
/// 应用ActionFilter扩展
/// Home控制器的Index
/// </summary>
/// <returns>Index视图</returns>
[HttpGet]
[TypeFilter(typeof(ActionFilter))]
public IActionResult Index(int id)
{
object Info = "请求Home控制器Index方法成功!";
return View(Info);
}
关键类ActionFilter代码:
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Newtonsoft.Json;
using Study_ASP.NET_Core_MVC.Controllers;
namespace Study_ASP.NET_Core_MVC.Utility.Filters
{
public class ActionFilter : Attribute, IActionFilter
{
/// <summary>
/// 初始化构造函数
/// </summary>
private readonly ILogger<ActionFilter> _logger;
public ActionFilter(ILogger<ActionFilter> logger)
{
_logger = logger;
}
/// <summary>
/// 在XXX执行之前
/// </summary>
/// <param name="context"></param>
public void OnActionExecuting(ActionExecutingContext context)
{
var controller = context.HttpContext.GetRouteValue("Controller");
var action = context.HttpContext.GetRouteValue("Action");
var param = context.Result;
_logger.LogInformation($"当前请求的控制器:{controller},方法:{action},请求参数:{JsonConvert.SerializeObject(param)}");
}
/// <summary>
/// 在XXX执行之后
/// </summary>
/// <param name="context"></param>
public void OnActionExecuted(ActionExecutedContext context)
{
var controller = context.HttpContext.GetRouteValue("Controller");
var action = context.HttpContext.GetRouteValue("Action");
var param = context.Result;
_logger.LogInformation($"当前请求的控制器:{controller},方法:{action},请求结果:{JsonConvert.SerializeObject(param)}");
}
}
}
效果截图:
日志记录:
2023-02-13 19:06:27.5242|0|INFO|Study_ASP.NET_Core_MVC.Utility.Filters.ActionFilter|当前请求的控制器:Home,方法:Index,请求参数:"?id=123456789"
2023-02-13 19:06:27.5568|0|INFO|Study_ASP.NET_Core_MVC.Utility.Filters.ActionFilter|当前请求的控制器:Home,方法:Index,请求结果:"{\"StatusCode\":null,\"ViewName\":null,\"Model\":\"请求Home控制器Index方法成功!\",\"ViewData\":{},\"TempData\":{},\"ViewEngine\":null,\"ContentType\":null}"
三:IAsyncActionFilter异步
控制器代码:
/// <summary>
/// Get请求
/// 应用ActionAsyncFilter扩展
/// Home控制器的Index
/// </summary>
/// <returns>Index视图</returns>
[HttpGet]
[TypeFilter(typeof(ActionAsyncFilter))]
public IActionResult Index(int id)
{
object Info = "请求Home控制器Index方法成功!";
return View(Info);
}
关键类ActionAsyncFilter代码:
using Microsoft.AspNetCore.Mvc.Filters;
using Newtonsoft.Json;
namespace Study_ASP.NET_Core_MVC.Utility.Filters
{
public class ActionAsyncFilter : Attribute, IAsyncActionFilter
{
/// <summary>
/// 初始化构造函数
/// </summary>
private readonly ILogger<ActionAsyncFilter> _logger;
public ActionAsyncFilter(ILogger<ActionAsyncFilter> logger)
{
_logger = logger;
}
/// <summary>
/// 在XXX执行时
/// </summary>
/// <param name="context"></param>
/// <param name="next"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
var controller = context.HttpContext.GetRouteValue("Controller");
var action = context.HttpContext.GetRouteValue("Action");
var param = context.HttpContext.Request.QueryString.Value;
_logger.LogInformation($"当前请求的控制器:{controller},方法:{action},请求参数:{JsonConvert.SerializeObject(param)}");
ActionExecutedContext executedContext = await next.Invoke();
_logger.LogInformation($"当前请求的控制器:{controller},方法:{action},请求结果:{JsonConvert.SerializeObject(executedContext.Result)}");
}
}
}
效果截图: