一、什么是Filter
在 ASP.NET Core 中,Filter 是一种用于处理 HTTP 请求和响应的机制,它可以让你在请求和响应的不同阶段添加额外的逻辑。Filter 在 MVC(Model-View-Controller)和 Web API 应用程序中起着重要作用,可以帮助你实现诸如身份验证、授权、日志记录、异常处理等功能。
二、 创建自定义的 Action Filter
/// <summary>
/// 自定义的 Action Filter,用于在动作方法执行前后记录日志
/// </summary>
public class CustomActionFilter : ActionFilterAttribute
{
private static readonly ILog log = LogManager.GetLogger(typeof(CustomActionFilter));
/// <summary>
/// Id
/// </summary>
private string SysId { get; set; }
/// <summary>
/// 密钥
/// </summary>
private string SysSecret { get; set; }
/// <summary>
/// 构造函数,接收系统Id和密钥
/// </summary>
/// <param name="sysId"></param>
/// <param name="sysSecret"></param>
public CustomActionFilter(string sysId, string sysSecret)
{
this.SysId = sysId;
this.SysSecret = sysSecret;
}
/// <summary>
/// Action执行前的逻辑
/// </summary>
/// <param name="context"></param>
/// <param name="next"></param>
/// <returns></returns>
public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
log.Info("Action执行前...");
var request = context.HttpContext.Request;
string sysId = GetRequestValue(context, SysId);
string sysSecret = GetRequestValue(context, SysSecret);
if (string.IsNullOrEmpty(sysId) || string.IsNullOrEmpty(sysSecret))
{
//context.Result = new UnauthorizedObjectResult("签名无效!");
//return;
}
#region sysId 和 sysSecret 都不为空的情况下执行的操作(建议这存储到数据库)
// 执行并记录日志
FilterLog filterLog = new FilterLog()
{
Name = context.Controller.GetType().Name,
RequestUrl = GetUrl(request),
RequestMethod = request.Method,
RequestBody = await GetBodyAsStringAsync(request),
RequestTime = DateTime.Now,
RequestIpAddress = context.HttpContext.Connection.RemoteIpAddress?.ToString(),
};
string json = JsonConvert.SerializeObject(filterLog);