ASP.NET Core 8 Web API 中的 IExceptionHandler 不起作用

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

我正在尝试使用 .NET 8 的新

IExceptionHandler

我有一个

ExceptionHandler
课程:

public class ExceptionHandler : IExceptionHandler
{
    public async ValueTask<bool> TryHandleAsync(HttpContext context, Exception ex, CancellationToken ct)
    {
        switch (ex)
        {
            case ArgumentNullException:
                await context.Response.WriteAsJsonAsync(new ProblemDetails
                    {
                        Status = StatusCodes.Status400BadRequest,
                        Type = ex.GetType().Name,
                        Title = ex.Message,
                        Detail = ex.Message,
                        Instance = $"{context.Request.Method} {context.Request.Path}"
                    });
                break;

            default:
                await context.Response.WriteAsJsonAsync(new ProblemDetails
                    {
                        Status = StatusCodes.Status500InternalServerError,
                        Type = ex.GetType().Name,
                        Title = ("Internal server error"),
                        Detail = ("Internal server error"),
                        Instance = $"{context.Request.Method} {context.Request.Path}"
                    });
                break;
        }

        return true;
    }
}

在startup.cs中我将服务配置为:

services.AddExceptionHandler<ExceptionHandler>();

我有一个 API 控制器:

public class UsersController : ControllerBase
{
    private IUserService _userService;

    public UsersController(IUserService userService)
    {
        _userService = userService;
    }

    [HttpPost("authenticate")]
    public async Task<IActionResult> Authenticate(AuthenticateRequest model)
    {
        try 
        { 
            var response = await  _userService.Authenticate(model);
            return Ok(response);
        }
        catch
        {
            throw new Exception("hello world!");
        }
    }
}

该错误未被

IExceptionHandler
处理。

asp.net-core-webapi .net-8.0
1个回答
0
投票

您缺少一些配置设置:

builder.Services.AddProblemDetails();

app.UseExceptionHandler();

因此示例

Program.cs
看起来像这样:

using Microsoft.AspNetCore.Diagnostics;
using Microsoft.AspNetCore.Mvc;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();

builder.Services.AddExceptionHandler<ExceptionHandler>();
builder.Services.AddProblemDetails();
var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();
app.UseExceptionHandler();
app.UseAuthorization();

app.MapControllers();

app.Run();


public class ExceptionHandler : IExceptionHandler
{
    public async ValueTask<bool> TryHandleAsync(HttpContext context, Exception ex, CancellationToken ct)
    {
        switch (ex)
        {
            case ArgumentNullException:
                await context.Response.WriteAsJsonAsync(new ProblemDetails
                {
                    Status = StatusCodes.Status400BadRequest,
                    Type = ex.GetType().Name,
                    Title = ex.Message,
                    Detail = ex.Message,
                    Instance = $"{context.Request.Method} {context.Request.Path}"
                });
                break;
            default:
                await context.Response.WriteAsJsonAsync(new ProblemDetails
                {
                    Status = StatusCodes.Status500InternalServerError,
                    Type = ex.GetType().Name,
                    Title = ("Internal server error"),
                    Detail = ("Internal server error"),
                    Instance = $"{context.Request.Method} {context.Request.Path}"
                });
                break;
        }
        return true;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.