在我正在使用的Web API中,在将JSON响应发送到调用程序之前,我正在检查几个条件。
我处理错误的一种方法是返回这样的内容:
return Content(HttpStatusCode.NotFound, "This user reached maximum API calls for today.", new JsonMediaTypeFormatter(), "application/json");
当我使用类似的东西测试API时:
var result = new System.Net.WebClient().DownloadString("BadURL");
我得到unhandled Exception error
,这是预期的。
为了解决这个问题,我将错误处理逻辑中的return语句更改为:
return Content(HttpStatusCode.OK, "This user reached maximum API calls for today.", new JsonMediaTypeFormatter(), "application/json");
因此,即使用户使用上述相同的WebClient()
,他们也会收到一条有用的错误消息(这个和其他错误消息在网站上有详细记录)而没有Exception
这是在ASP.NET Web API中处理错误的良好方式吗?
答案 0 :(得分:1)
我认为你应该让你的API以标准状态代码为模型。 (出现错误时不应返回200)。
以下是REST API http://www.restapitutorial.com/httpstatuscodes.html
的一些常用状态代码您所看到的问题只是WebClient
在许多状态代码上抛出异常(例如404)。我不认为你的api应该围绕使WebClient不抛出异常。您可以将WebClient包装在try catch中并获取WebException并从那里获取状态代码和错误消息。
(未经过测试的代码,但与此类似)
try
{
var result = new System.Net.WebClient().DownloadString("BadURL");
// process result
}
catch (WebException webEx)
{
var statusCode = ((HttpWebResponse)webEx.Response).StatusCode;
var body = new StreamReader(webEx.Response.GetResponseStream()).ReadToEnd();
switch (statusCode)
{
case 404:
// parse error from your body (or in your case it is your body)
case ...:
}
}
答案 1 :(得分:1)
您可能应该针对各种情况调查正确的HTTP响应。如果我的条件失败(达到api限制),我会收到4xx错误,因为它告诉我不要重试请求。可能有402或甚至509.有些人可能认为403是合适的,因为它意味着您的身份验证是好的,您不能因任何原因而被允许访问资源(例如,由于超出限制而删除了授权)
话虽如此,您还是要考虑API的安全性。许多API仅返回2xx 400和500.原因是您不一定要提供有关错误的过多信息。 400告诉我,我的请求是坏的,我应该停止尝试,500告诉我服务器窒息的东西(不是我的问题)。如果您需要提供更多信息供开发人员使用,请考虑使用包含应用程序代码的自定义消息格式,并确保有开发人员文档来解释代码。
例如:
400 response with body
{
"code" : 8512,
"message" : "account status"
}
这为您提供了粒度和一定程度的默默无闻。我的客户现在可以看到我应该停止尝试请求,但如果代码很重要,我可以用它来采取行动。
下面提到WebClient会引发它,您可以捕获它,检查代码并构建适当的消息。但是,我建议使用HttpClient,如果你告诉它只会导致非成功。它是更标准的客户端。
我过去所做的是将我的服务响应包装在包含所有响应规则的格式化程序中。因此,例如,我将获得HttpResponseMessage,我将其用作通用格式化程序的ctor参数。格式化程序基本上会公开响应内容并翻译代码,并将两者都放入我可以发回的标准响应格式中。这包括我的API充当另一个Web服务的代理的情况。为了覆盖我只需要转换异常(或其他错误)的情况,我们只是添加到具有异常到状态代码映射的映射(我们放在格式化程序中的那个)。如果你对这样的事情感兴趣,请告诉我,我会尝试重新创建它。