using Microsoft.AspNetCore.Mvc.Filters;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace AOPTestWebApi.Utility
{
/// <summary>
/// 给控制器方法增加记录日志功能,即在控制器方法执行前或后调用以下方法
/// </summary>
public class LogActionFilterAttribute : ActionFilterAttribute
{
//方法执行前调用
public override void OnActionExecuting(ActionExecutingContext context)
{//仅限控件器类或方法有效。
string url = context.HttpContext.Request.Path.Value;
string argument=JsonSerializer.Serialize(context.ActionArguments);
string controllerName = context.Controller.GetType().FullName;
string actionName = context.ActionDescriptor.DisplayName;
Console.WriteLine($"AOP切面开始: 请求url={url}---argument={argument}");
}
//方法执行完成后调用
public override void OnActionExecuted(ActionExecutedContext context)
{
Console.WriteLine("AOP切面结束");
}
}
}
一、仅为单个控制器方法增加切面日志功能,在方法上增加 [LogActionFilter] 特性
[LogActionFilter]
[HttpGet("Writer")]
public ActionResult Writer()
{
m_TestService.Writer();
return Ok();
}
二、为某个控制器类中所有的方法增加切面日志功能,即在控件器类上增加 [LogActionFilter] 特性
[LogActionFilter]
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
ITestService m_TestService;
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
}
三、为项目中所有控制器类增加切面日志功能
builder.Services.AddControllers(options=>options.Filters.Add<LogActionFilterAttribute>());