簡體   English   中英

ASP.NET 內核 Web API 使用請求/響應模式處理異常

[英]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 傳遞到全局錯誤處理中,可以是產品,或者客戶,位置等**

ASP.NET 內核 Web API 異常處理

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM