[英]ASP.NET Core Web API how to catch the 401 and 403 errors using the try catch method
我正在使用庫Microsoft.AspNetCore.Http
和Microsoft.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; }
}
我的標准 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 });
}
}
根據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;
}
});
您可以通過將以下內容添加到 Startup.cs 中的 Configure 方法來完成此操作
這將讓您攔截和更改響應的各個方面以及內容類型。 在下面的示例中,我們返回一個帶有消息的簡單 JSON object。
app.Use(async (context, next) =>
{
await next();
if (context.Response.StatusCode == (int)HttpStatusCode.Unauthorized) // 401
{
context.Response.ContentType = "application/json";
await context.Response.WriteAsync(new {
Message = "You must be logged in to access this resource."
}.ToString());
}
if (context.Response.StatusCode == (int)HttpStatusCode.Forbidden) // 403
{
context.Response.ContentType = "application/json";
await context.Response.WriteAsync(new
{
Message = "Your claims are incorrect."
}.ToString());
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.