Обработка исключений ASP.NET Core Web API с шаблоном запросов / ответов - PullRequest
0 голосов
/ 22 сентября 2019

Мы хотим применить глобальную обработку ошибок с шаблоном Запрос / Ответ.Текущий код выглядит так, как показано ниже.Цель состоит в том, чтобы привести пользовательский объект Response в вызов глобальной обработки ошибок.Это возможно?См. Объект пользовательского ответа ниже и пример глобальной обработки ошибок.

Текущий код:

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; }
}

}

** Код цели: какя бы слил пользовательский объект ответа выше с обработкой ошибок здесь?Является ли это возможным?Хотите передать как параметр объекта в глобальную обработку ошибок, это может быть Product или Customer, Location и т. Д. **

Обработка исключений ASP.NET Core 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-processing-aspnetcore /

1 Ответ

0 голосов
/ 22 сентября 2019

Вы не можете.Ну, вы можете, но это грязно.

У вас есть два типа пользовательских ошибок, и клиент захочет иметь возможность проанализировать оба, плюс ответ с ошибкой.

Очевидно, вы можете просто провалитьсякогда вы десериализуете на стороне клиента.

Обычно вы проверяете httpcode, а если его нет 200, вы знаете, что десериализуете объект ошибки.Вы можете попробовать первый стиль, а затем второй, если это бросает.Но это не лучший подход.

Лучше избавиться от одного из ваших пользовательских форматов ошибок.

Обработка ошибок вашего контроллера - худшая из двух.Он не будет проходить через коды ошибок, такие как 401, если у вас есть зависимость, которая использует тот же аутентификатор.

Но, если серьезно, оболочка просто сбивает с толку то, что клиент должен проверить, чтобы проверить, хорош ответ или нет.Пусть клиент сгенерирует исключение, когда сервер вернет исключение.Не оборачивайте все это в пользовательский объект, и у вызывающего кода есть if(response.IsError) { throw..}, замусоренный везде

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...