Я создаю 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). )