ITPub博客

首页 > 数据库 > 数据库开发技术 > 在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作

在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作

原创 数据库开发技术 作者:后端Q 时间:2024-09-30 08:00:00 0 删除 编辑

ASP.NET Core Web API 提供了强大的功能来构建 RESTful 服务。在开发 Web API 时,我们经常会遇到一些需要在每个操作(Action)前后执行的通用逻辑,比如日志记录、异常处理、权限验证等。为了简化代码和增加可维护性,我们可以使用操作筛选器(Action Filters)来统一处理这些通用操作。

本文将介绍如何在 ASP.NET Core Web API 中使用操作筛选器,并通过示例代码展示如何实现日志记录和异常处理的通用操作。

什么是操作筛选器?

操作筛选器在 ASP.NET Core 管道中运行,允许我们在操作执行的前后插入逻辑。操作筛选器可以用于以下场景:

  • 记录日志
  • 处理异常
  • 验证权限
  • 修改请求或响应数据

ASP.NET Core 提供了多种筛选器,包括:

  • 授权筛选器(Authorization filters)
  • 资源筛选器(Resource filters)
  • 操作筛选器(Action filters)
  • 异常筛选器(Exception filters)
  • 结果筛选器(Result filters)

本文将重点介绍操作筛选器。

创建操作筛选器

首先,我们创建一个自定义的操作筛选器,用于记录操作执行前后的日志,并处理异常。

创建日志和异常处理筛选器

  1. 创建一个新的类 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;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2023-01-22

  • 博文量
    1540
  • 访问量
    727232