【发布时间】:2018-01-26 03:25:48
【问题描述】:
我正在使用HttpClient 调用我的Web API,我看到有一个EnsureSuccessStatusCode 方法和一个IsSuccessStatusCode 属性。哪一个合适?
我阅读了这篇文章,还有几个问题:
Usage of EnsureSuccessStatusCode and handling of HttpRequestException it throws
我遇到的问题是,如果我发送一个 GET 请求并传递我要检索的对象的 ID,基本上有两种结果:
- 我以状态 200 取回对象
- 我可以返回 null,因为没有匹配项,但这会导致状态为 404。
如果我调用EnsureSuccessStatusCode(),状态 404 将导致抛出异常。这并不理想,因为当我测试我的代码时,我不断收到 404 错误,起初我认为 API URL 不正确,但实际上没有与提供的 Id 匹配的对象。在这种情况下,我宁愿返回一个空对象而不是抛出异常。
因此,我尝试检查 IsSuccessfulStatusCode 属性的值。这似乎是一个更好的选择,当此属性为 false 时,我可以返回一个 null 对象,但是,有许多状态代码会导致此属性具有 false 值。 404 是其中之一,但还有其他几个状态代码,例如 400 Bad Request、405 Method Not Allowed 等。我想记录一个异常除了 404 之外的所有不成功的错误代码,我想知道是否有比检查响应的 ResponseCode 值然后抛出一个被我的 catch 块捕获的异常更好的方法,这是日志记录的地方发生。
这是我的 GET 方法的代码:
public static Customer GetCustomerByID(int id)
{
try
{
using (var client = GetConfiguredClient())
{
Customer customer = null;
var requestUri = $"Customers/{id}";
using (var response = client.GetAsync(requestUri).Result)
{
if (response.IsSuccessStatusCode)
customer = response.Content.ReadAsAsync<Customer>().Result;
}
return customer;
}
}
catch (Exception ex)
{
ex.Data.Add(nameof(id), id);
LogException(ex);
throw;
}
}
如果返回不成功的状态代码并且没有记录任何内容,则此代码将仅返回 null Customer。
处理这种情况的最佳方法是什么?
【问题讨论】:
标签: c# asp.net-web-api exception-handling httpresponse