.NET 8.0 自定义IExceptionHandler不生效


在 .NET 8.0 中,自定义 IExceptionHandler 可能因为一些配置问题或代码实现问题而不生效。为了确保自定义的 IExceptionHandler 能正常工作,可以按照以下步骤进行排查和配置:

步骤一:创建自定义 IExceptionHandler

首先,创建一个自定义的 IExceptionHandler 实现,例如:

using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;

public class CustomExceptionHandler : IExceptionHandler
{
    public async Task HandleAsync(HttpContext context, Exception exception)
    {
        // 自定义异常处理逻辑
        context.Response.ContentType = "application/json";
        context.Response.StatusCode = StatusCodes.Status500InternalServerError;
        await context.Response.WriteAsync(new
        {
            error = exception.Message
        }.ToString());
    }
}

步骤二:注册自定义 IExceptionHandler

Program.cs 文件中,将自定义的 IExceptionHandler 注册到服务容器中:

var builder = WebApplication.CreateBuilder(args);

// 添加自定义异常处理器
builder.Services.AddSingleton<IExceptionHandler, CustomExceptionHandler>();

var app = builder.Build();

// 使用自定义异常处理器中间件
app.UseMiddleware<ExceptionHandlerMiddleware>();

app.MapGet("/", () => "Hello World!");

app.Run();

步骤三:创建异常处理中间件

创建一个中间件,用于捕获全局异常并调用自定义的 IExceptionHandler

using Microsoft.AspNetCore.Http;
using System;
using System.Threading.Tasks;

public class ExceptionHandlerMiddleware
{
    private readonly RequestDelegate _next;
    private readonly IExceptionHandler _exceptionHandler;

    public ExceptionHandlerMiddleware(RequestDelegate next, IExceptionHandler exceptionHandler)
    {
        _next = next;
        _exceptionHandler = exceptionHandler;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        try
        {
            await _next(context);
        }
        catch (Exception ex)
        {
            await _exceptionHandler.HandleAsync(context, ex);
        }
    }
}

步骤四:在管道中使用异常处理中间件

确保在请求处理管道中使用 ExceptionHandlerMiddleware

app.UseMiddleware<ExceptionHandlerMiddleware>();

步骤五:验证异常处理

测试应用程序,确保自定义异常处理逻辑生效。例如,可以在控制器或中间件中抛出一个异常,看是否能被 CustomExceptionHandler 处理:

app.MapGet("/throw", () => throw new Exception("Test exception"));

完整示例

以下是一个完整的示例代码:

Program.cs:

var builder = WebApplication.CreateBuilder(args);

// 注册自定义异常处理器
builder.Services.AddSingleton<IExceptionHandler, CustomExceptionHandler>();

var app = builder.Build();

// 使用自定义异常处理中间件
app.UseMiddleware<ExceptionHandlerMiddleware>();

app.MapGet("/", () => "Hello World!");
app.MapGet("/throw", () => throw new Exception("Test exception"));

app.Run();

CustomExceptionHandler.cs:

using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;

public class CustomExceptionHandler : IExceptionHandler
{
    public async Task HandleAsync(HttpContext context, Exception exception)
    {
        // 自定义异常处理逻辑
        context.Response.ContentType = "application/json";
        context.Response.StatusCode = StatusCodes.Status500InternalServerError;
        await context.Response.WriteAsync(new
        {
            error = exception.Message
        }.ToString());
    }
}

ExceptionHandlerMiddleware.cs:

using Microsoft.AspNetCore.Http;
using System;
using System.Threading.Tasks;

public class ExceptionHandlerMiddleware
{
    private readonly RequestDelegate _next;
    private readonly IExceptionHandler _exceptionHandler;

    public ExceptionHandlerMiddleware(RequestDelegate next, IExceptionHandler exceptionHandler)
    {
        _next = next;
        _exceptionHandler = exceptionHandler;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        try
        {
            await _next(context);
        }
        catch (Exception ex)
        {
            await _exceptionHandler.HandleAsync(context, ex);
        }
    }
}

通过上述步骤和代码配置,你应该能够使自定义的 IExceptionHandler 在 .NET 8.0 项目中生效。确保各部分代码正确无误,并按正确顺序添加到中间件管道中。


原文链接:codingdict.net