[英]ASP.NET Core Web API exception handling with Request/Response Pattern
我們希望通過請求/響應模式應用全局錯誤處理。 當前代碼如下所示。 目標是將自定義響應 object 帶入全局錯誤處理調用。 這可能嗎? 請參閱下面的自定義響應 object 和全局錯誤處理示例。
當前代碼:
public async Task<ActionResult<GetAllProductResponse>> Get(ProductRequest productRequest)
{
try
{
var products = await ProductAppService.GetAllProducts();
var response = new GetAllProductResponse { Body = products };
return Ok(response);
}
catch (Exception ex)
{
logger.LogError(ex, ex.Message);
var response = new GetAllProductResponse { HasError = true, Error = ex.Message };
return StatusCode(StatusCodes.Status500InternalServerError, response);
}
}
public class GetAllDepartmentResponse : BaseRequestResponse<IEnumerable<ProductDto>>
{
}
public class BaseRequestResponse<T>
{
[Required, ValidateObject]
public T Body { get; set; }
public bool HasError { get; set; }
public string Error { get; set; }
}
}
**目標代碼:如何將上面的自定義響應 Object 與此處的錯誤處理合並? 可能嗎? 想要作為參數 object 傳遞到全局錯誤處理中,可以是產品,或者客戶,位置等**
public class ErrorHandlingMiddleware
{
private readonly RequestDelegate next;
public ErrorHandlingMiddleware(RequestDelegate next)
{
this.next = next;
}
public async Task Invoke(HttpContext context /* other dependencies */)
{
try
{
await next(context);
}
catch (Exception ex)
{
await HandleExceptionAsync(context, ex);
}
}
private static Task HandleExceptionAsync(HttpContext context, Exception ex)
{
var code = HttpStatusCode.InternalServerError; // 500 if unexpected
if (ex is MyNotFoundException) code = HttpStatusCode.NotFound;
else if (ex is MyUnauthorizedException) code = HttpStatusCode.Unauthorized;
else if (ex is MyException) code = HttpStatusCode.BadRequest;
var result = JsonConvert.SerializeObject(new { error = ex.Message });
context.Response.ContentType = "application/json";
context.Response.StatusCode = (int)code;
return context.Response.WriteAsync(result);
}
}
另一個資源: https://code-maze.com/global-error-handling-aspnetcore/
你不能。 好吧,你可以,但它很亂。
您有兩種類型的自定義錯誤,客戶端將希望能夠解析這兩種錯誤,以及非錯誤響應。
顯然,當您在客戶端反序列化時,您可能會簡單地失敗。
通常你檢查httpcode,如果它不是200,你知道反序列化一個錯誤object。 您可以嘗試第一種樣式,然后嘗試第二種樣式。 但這不是一個好方法。
最好擺脫一種自定義錯誤格式。
您的 controller 錯誤處理是兩者中最差的。 如果您有使用相同身份驗證的依賴項,它將不會通過錯誤代碼,例如 401。
但更嚴重的是,包裝器只會混淆客戶端必須檢查的內容,以查看響應是否良好。 當服務器返回異常時,讓客戶端拋出異常。 不要將其全部包裝在自定義 object 中,並讓調用代碼到處亂扔if(response.IsError) { throw..}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.