在 .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()); } }
在 Program.cs 文件中,将自定义的 IExceptionHandler 注册到服务容器中:
Program.cs
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:
ExceptionHandlerMiddleware
app.UseMiddleware<ExceptionHandlerMiddleware>();
测试应用程序,确保自定义异常处理逻辑生效。例如,可以在控制器或中间件中抛出一个异常,看是否能被 CustomExceptionHandler 处理:
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:
ExceptionHandlerMiddleware.cs:
通过上述步骤和代码配置,你应该能够使自定义的 IExceptionHandler 在 .NET 8.0 项目中生效。确保各部分代码正确无误,并按正确顺序添加到中间件管道中。
原文链接:codingdict.net