Какой правильный код статуса HTTP отвечает за конкретные исключения - PullRequest
1 голос
/ 31 марта 2019

Я создаю REST Web API в C # с использованием ASP.NET Web API для MVC 5.

Я создал абстрактный класс BaseApiController, который расширяют все контроллеры API. В этом базовом контроллере я обрабатываю все исключения и все, что нужно контроллерам для правильной работы.

Я уже реализовал обработку исключений для следующих исключений:

    public override async Task<HttpResponseMessage> ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)
    {
        string controllerName = null;
        string actionName = null;

        try
        {
            SetContext(controllerContext);
            SetServices();

            await AuthenticateUser();

            controllerName = controllerContext?.Controller?.GetType().FullName;
            var services = controllerContext?.ControllerDescriptor?.Configuration?.Services;
            actionName = services?.GetActionSelector()?.SelectAction(controllerContext)?.ActionName;

            return await base.ExecuteAsync(controllerContext, cancellationToken);
        }
        catch (HttpResponseException e)
        {
            ClientDataService.Logger(e, $"{controllerName}.{actionName}",
                $"Response -> Status Code: {(int)e.Response.StatusCode}, Reason: {e.Response.ReasonPhrase}",
                SystemLogOriginTypesEnum.WEBSITE_API);

            throw;
        }            
        catch (Exception e)
        {
            ClientDataService.Logger(e, $"{controllerName}.{actionName}",
                $"Response -> Status Code: {(int)HttpStatusCode.InternalServerError}, Reason: Internal server error",
                SystemLogOriginTypesEnum.WEBSITE_API);

            throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError)
            {
                Content = new StringContent("Internal server error"),
                ReasonPhrase = "Internal server error"
            });
        }

Контроллеры генерируют HttpResponseException в основном, когда обязательные параметры не переданы или не настроены должным образом (код состояния HTTP) 400), второй случай, когда что-то пошло не так (код состояния HTTP 500).

У меня вопрос, какой код состояния HTTP должен API реагировать, когда служба генерирует исключения, например NotSupportedException или пользовательский InvalidSortAttributeException?

Я не имею в виду категории статуса HTTP, то есть 4XX против 5XX, поскольку InvalidSortAttributeException должен быть категорией 4XX, поскольку ошибка возникает из-за недопустимого запроса, возможно, 400 (неправильный запрос)!?

Хотя второе, я полагаю, может относиться к обеим категориям, поскольку сервер не поддерживает запрос, но это не значит, что он не будет поддерживать его в будущем, возможно, 406 (NotAcceptable) или 501 (NotImplemented). )

1 Ответ

0 голосов
/ 31 марта 2019

4XX построен специально для пользовательских ошибок 5XX построен для внутренних ошибок сервера

Вы должны ответить интеллектуальным кодом для сценария. Если есть исключение, которое не поддерживается, но ваш вызывающий код создал не поддерживаемый сценарий, то это 500. Если пользователю удалось составить неверный запрос, это должно быть 4XX.

Также обратите внимание, что существует разница между отсутствием атрибута в запросе JSON (400) и пропуском значения в URL (404), или ресурс больше недоступен (404).

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