Как обрабатывать пользовательские исключения в Asp. Net Core Web API на сервере - PullRequest
1 голос
/ 04 февраля 2020

У меня есть простое asp. net core 3.1 web api-приложение и CustomExceptionHandlerMiddleware. На моем локальном компьютере все работает хорошо, но когда я размещаю (модель хостинга inProcess), мой проект под IIS api не возвращает мои исключения. Вот пример кода:

    public async Task<string> PostTestAsync(TestRequest request)
    {
        if (request.Key == "exception")
        {
            throw new BusinessException(System.Net.HttpStatusCode.NotFound, "Post Test exception");
        }
        var response = await Task.Factory.StartNew(() =>
        {
            return $"Post {request.Key}";
        });
        return response;
    }

Когда я отправляю на request.Key = "исключение", приложение возвращает "Идентификатор соединения" {ConnectionId} ", идентификатор запроса" {TraceIdentifier} ": необработанное исключение было вызвано приложение.".

Но при отправке, отличной от "исключения", работает нормально.

Вот мое CustomExceptionMiddleware:

    public async Task InvokeAsync(HttpContext httpContext)
    {
        try
        {
            await _next(httpContext);
        }
        catch (Exception exception)
        {
            _logger.LogError(exception, exception.Message);

            var code = exception is BusinessException ? (exception as BusinessException).StatusCode : HttpStatusCode.InternalServerError;
            httpContext.Response.ContentType = "application/json";
            httpContext.Response.StatusCode = (int)code;

            var apiResponse = new MyApiResponse
            {
                IsSuccess = false,
                ErrorResponse = new ErrorResponse
                {
                    Type = exception.GetType().ToString(),
                    StatusCode = (int)code,
                    Message = exception.Message,
                    StackTrace = exception.StackTrace
                }
            };

            var jApiResponse = JsonConvert.SerializeObject(apiResponse, new JsonSerializerSettings
            {
                ContractResolver = new CamelCasePropertyNamesContractResolver()
            });
            await httpContext.Response.WriteAsync(jApiResponse);
        }
    }

1 Ответ

0 голосов
/ 04 февраля 2020

Я решил проблему. Мой класс запуска был таким:

if(env.IsDevelopment())
    app.UseMyExceptionHandler();

Итак, на сервере; среда не является разработкой, и когда я выкидываю какое-либо исключение, myMiddleware не перехватывает его, и приложение возвращает InternalServerError. Я также добавил env.IsProduction() условие и все решено.

...