ASP.NET Core Web API如何使用try catch方法捕获401和403错误

nou*_*our 1 c# asp.net-core asp.net-core-webapi

我正在使用库Microsoft.AspNetCore.HttpMicrosoft.AspNetCore.Mvc. 我还使用 Identity 的 JWT 令牌。

当令牌过期时,API 会抛出 http 401 错误,如果声明错误,则会返回 http 403 错误。

我需要能够捕获这两个雕像并将它们包装在我的统一错误消息格式中

public class ErrorMessage
{
     public int httpStatus { get; set; }
     public string Header { get; set; } = "Error";
     public string Message { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的标准 API 格式

[Authorize]
[HttpPost]
[Route("Logout")]
public async Task<IActionResult> Logout()
{
    try
    {
        ....
    }
    catch (Exception e)
    {
        _logger.LogError($"Error in {nameof(Login)}: {e}");
        return BadRequest(new ErrorMessage { httpStatus = 500, Message = e.Message });
    }
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*ica 5

根据ASP.NET Core 中的处理错误,您可以使用UseStatusCodePages

app.UseStatusCodePages(async statusCodeContext =>
{
    switch (statusCodeContext.HttpContext.Response.StatusCode)
    {
        case 401:
            statusCodeContext.HttpContext.Response.StatusCode = 400;
            await statusCodeContext.HttpContext.Response.WriteAsJsonAsync(new ErrorMessage { httpStatus = 500, Message = "some message" });
            break;
        case 403:
            statusCodeContext.HttpContext.Response.StatusCode = 400;
            await statusCodeContext.HttpContext.Response.WriteAsJsonAsync(new ErrorMessage { httpStatus = 500, Message = "some message" });
            break;
    }
});
Run Code Online (Sandbox Code Playgroud)