什么是特定异常的正确 HTTP 状态代码答案
Posted
技术标签:
【中文标题】什么是特定异常的正确 HTTP 状态代码答案【英文标题】:Whats the correct HTTP status code answer for specific Exceptions 【发布时间】:2019-03-31 15:35:37 【问题描述】:我正在使用用于 MVC 5 的 ASP.NET Web API 在 C# 中创建一个 REST Web API。
我创建了一个抽象类 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)。
我的问题是,当服务抛出 NotSupportedException
或自定义 InvalidSortAttributeException
等异常时,API 应该响应哪种 HTTP 状态代码?
我不是指 HTTP 状态类别,即 4XX 与 5XX,因为 InvalidSortAttributeException
应该是 4XX 类别,因为错误是从无效请求引发的,可能是 400(错误请求)!?
虽然第二个,我相信可能属于这两个类别,因为服务器不支持请求,但这并不完全意味着它将来不会支持它,可能是 406(不可接受)或 501(未实现)?
【问题讨论】:
Http status code for Exceptions的可能重复 我不认为这是重复的,因为在链接的帖子中只讨论了 HTTP 错误类别。主要是何时使用 4XX 与 5XX。我已经接受了 4XX 类别应该至少用于 InvalidSortAttributeException,因为它是当用户发送错误的排序属性时引发的错误,也许 NotSupportedException 可能是 5XX。不过,我更关注应该使用或在类似情况下最常使用的特定错误。 【参考方案1】:4XX 专为用户错误而构建 5XX 是为内部服务器错误而构建的
您必须使用场景的智能代码进行响应。如果存在不受支持的异常,但您的代码调用者构建了不受支持的场景,则为 500。如果用户设法将错误请求放在一起,则应为 4XX。
另请注意,JSON 请求中缺少属性 (400) 与 url 中缺少值 (404) 或资源不再可用 (404) 之间存在差异。
【讨论】:
感谢@c-bauer 的回复。根据您的回复,我将两者都更改为 400(错误请求),因为两者都是基于客户端使用 API 发出的请求。这意味着他要求的东西至少现在还不存在。 很高兴能帮助到@PedroPinto。如果您认为这是对您的问题的良好回答,您可以将其标记为答案,或者在您需要更多反馈时将其保持打开状态。以上是关于什么是特定异常的正确 HTTP 状态代码答案的主要内容,如果未能解决你的问题,请参考以下文章