在 ASP.NET Core Web API 中使用中间件进行异常处理、身份验证和错误日志记录的最佳实践

问题描述 投票:0回答:1

我正在开发一个 ASP.NET Core Web API 项目,并尝试使用中间件实现一些全局功能。具体来说,我想处理以下问题:

  • 全局异常处理:捕获未处理的异常并返回标准化的错误响应。
  • 身份验证:确保所有请求在处理之前都经过身份验证。
  • 全局错误日志记录:记录请求处理管道期间发生的所有错误。

我的问题是:

  • 在 ASP.NET Core Web API 中使用中间件进行全局异常处理是否是推荐做法?如果是的话,有没有常用的特定模式或库?
  • 中间件是实现身份验证的最佳方法吗?还是应该以不同的方式处理?
  • 对于全局错误日志记录,中间件是否是合适的解决方案,或者是否有其他首选方法或工具用于此目的?

这是我当前实施的简要概述:

public class ExceptionHandlingMiddleware
{
    private readonly RequestDelegate _next;

    public ExceptionHandlingMiddleware(RequestDelegate next)
    {
        _next = next;
    }
    
    public async Task Invoke(HttpContext context)
    {
        try
        {
            await _next(context);
        }
        catch (Exception ex)
        {
            // Handle exception and return response
            await HandleExceptionAsync(context, ex);
        }
    }
    
    private Task HandleExceptionAsync(HttpContext context, Exception exception)
    {
        // Log exception and set response status code
        // Return standardized error response
    }
}

// In Startup.cs
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseMiddleware<ExceptionHandlingMiddleware>();
  
    // Other middleware registrations
    app.UseAuthentication();
    app.UseAuthorization();
    
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}
asp.net-core authentication asp.net-core-webapi asp.net-core-middleware
1个回答
0
投票

中间件是一个强大的工具,用于实现异常处理、身份验证和错误日志记录等全局功能。

  1. 全局异常处理:建议使用中间件进行全局异常处理。它可以捕获管道中发生的未处理的异常并返回标准化的错误响应。ASP.NET Core 具有用于处理异常的内置中间件:

    UseExceptionHandler
    UseDeveloperExceptionPage
    。还可以创建用于异常处理的自定义中间件。
    Serilog
    NLog
    等库可用于高级日志记录和异常管理。 您的代码示例中已存在示例。

  2. 身份验证:虽然中间件可以处理身份验证的某些方面,但 ASP.NET Core 使用身份验证和授权中间件提供了一种更加结构化的方法:

    UseAuthentication
    UseAuthorization
    。这些内置中间件应该用于处理身份验证和授权。您的代码示例中已存在示例。

  3. 全局错误日志记录:中间件适合记录请求处理过程中发生的错误。对于全面的日志记录,包括请求管道之外的日志(例如后台任务),您还应该配置日志记录服务。为了记录您的示例代码可能如下所示:

    公共类异常处理中间件 { 私有只读RequestDelegate _next; 私有只读 ILogger _logger;

     public ExceptionHandlingMiddleware(RequestDelegate next, ILogger<ExceptionHandlingMiddleware> logger)
     {
         _next = next;
         _logger = logger;
     }
    
     public async Task Invoke(HttpContext context)
     {
         try
         {
             await _next(context);
         }
         catch (Exception ex)
         {
             _logger.LogError(ex, "An unhandled exception occurred.");
             await HandleExceptionAsync(context, ex);
         }
     }
    
     private Task HandleExceptionAsync(HttpContext context, Exception exception)
     {
         context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
         context.Response.ContentType = "application/json";
    
         var result = JsonConvert.SerializeObject(new { error = exception.Message });
         return context.Response.WriteAsync(result);
     }
    

    }

    // 在 Startup.cs 中 公共无效配置(IApplicationBuilder 应用程序,IWebHostEnvironment env) { 应用程序.UseMiddleware(); app.UseAuthentication(); 应用程序.UseAuthorization(); app.UseEndpoints(端点=> { 端点.MapControllers(); }); }

由于异常处理、日志记录、身份验证是分布在整个应用程序中的活动,并且由所有模块使用,而不是在这些模块的每个类中添加代码,因此我们可以创建中间件并在需要时注入。

© www.soinside.com 2019 - 2024. All rights reserved.