ASP.NET Core Web API 提供了强大的功能来构建 RESTful 服务。在开发 Web API 时,我们经常会遇到一些需要在每个操作(Action)前后执行的通用逻辑,比如日志记录、异常处理、权限验证等。为了简化代码和增加可维护性,我们可以使用操作筛选器(Action Filters)来统一处理这些通用操作。
本文将介绍如何在 ASP.NET Core Web API 中使用操作筛选器,并通过示例代码展示如何实现日志记录和异常处理的通用操作。
操作筛选器在 ASP.NET Core 管道中运行,允许我们在操作执行的前后插入逻辑。操作筛选器可以用于以下场景:
ASP.NET Core 提供了多种筛选器,包括:
本文将重点介绍操作筛选器。
首先,我们创建一个自定义的操作筛选器,用于记录操作执行前后的日志,并处理异常。
LoggingAndExceptionHandlingFilter,并实现 IActionFilter 接口。using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Logging;
using System;
public class LoggingAndExceptionHandlingFilter : IActionFilter
{
private readonly ILogger<LoggingAndExceptionHandlingFilter> _logger;
public LoggingAndExceptionHandlingFilter(ILogger<LoggingAndExceptionHandlingFilter> logger)
{
_logger = logger;
}
public void OnActionExecuting(ActionExecutingContext context)
{
// 记录操作开始执行的日志
_logger.LogInformation($"Action '{context.ActionDescriptor.DisplayName}' is executing.");
}
public void OnActionExecuted(ActionExecutedContext context)
{
if (context.Exception == null)
{
// 记录操作成功完成的日志
_logger.LogInformation($"Action '{context.ActionDescriptor.DisplayName}' executed successfully.");
}
else
{
// 记录操作执行过程中发生的异常,并处理异常
_logger.LogError(context.Exception, $"Action '{context.ActionDescriptor.DisplayName}' threw an exception.");
// 这里可以根据需要设置异常处理结果,比如返回一个统一的错误响应
context.Result = new ObjectResult(new { Error = "An unexpected error occurred." })
{
StatusCode = 500
};
context.ExceptionHandled = true; // 标记异常已处理
}
}
}
在 Startup.cs 中注册我们自定义的操作筛选器。
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(options =>
{
options.Filters.Add(new LoggingAndExceptionHandlingFilter(new Logger<LoggingAndExceptionHandlingFilter>(
new LoggerFactory().CreateLogger("LoggingAndExceptionHandlingFilter"))));
});
// 其他服务注册
}
★注意:在实际应用中,我们通常会使用依赖注入(DI)来注册
ILogger,而不是像上面示例中那样直接实例化。为了简化示例,这里直接实例化了ILogger。
现在,LoggingAndExceptionHandlingFilter 筛选器会自动应用于所有控制器操作。如果你希望仅应用于特定控制器或操作,可以使用属性标记的方式。
[ApiController]
[Route("api/[controller]")]
public class SampleController : ControllerBase
{
[HttpGet]
[TypeFilter(typeof(LoggingAndExceptionHandlingFilter))] // 仅应用于这个操作
public IActionResult Get()
{
return Ok("Hello, World!");
}
[HttpPost]
public IActionResult Post()
{
// 这个操作也会应用全局筛选器
throw new InvalidOperationException("An example exception.");
}
}
启动你的 ASP.NET Core Web API 项目,并访问 /api/sample 和 /api/sample/post 端点。
/api/sample 会记录操作开始和执行成功的日志,并返回 "Hello, World!"。/api/sample/post 会记录操作开始和异常发生的日志,并返回 500 状态码和统一错误响应。通过使用操作筛选器,我们可以在 ASP.NET Core Web API 中轻松地实现通用操作的统一处理,如日志记录和异常处理。这不仅提高了代码的可维护性,还确保了操作的一致行为。希望本文对你有所帮助,让你在实际项目中更好地应用操作筛选器。
原文作者:后端Q;如有侵权,请联系管理员删除。