2

我正在使用 ASP.NET Web API 创建一个 HTTP API。我注意到,如果发生我未处理的异常,则该行为与我故意抛出 HttpResponseException 时的行为非常不同。这将使客户端难以可靠地处理错误并显示“原因”消息。

例如考虑这个代码:

[HttpPost]
public void ThisWillThrowAnError()
{
    try
    {
        var i = 0;
        var b = 1 / i; // cause divide by zero exception for testing
    }
    catch (Exception ex)
    {
        HttpResponseMessage message = new HttpResponseMessage();
        message.ReasonPhrase = "Error: " + ex.Message;
        throw new HttpResponseException(message);
    }
}

这将创建一个响应,该响应在 HTTP 标头中有错误,并且响应代码设置为 500: 错误:无法处理此请求。试图除以零。

实际的响应正文是空的。

但是,如果我删除 try/catch 块,或者如果发生我没有手动抛出 HttpResponseException 的异常,我会得到完全不同的行为。虽然状态码仍然是 500,但标头消息只是显示“内部服务器错误”,并且消息以 JSON 格式编码,如下所示:

{
  "Message": "An error has occurred.",
  "ExceptionMessage": "Attempted to divide by zero.",
  "ExceptionType": "System.DivideByZeroException",
  "StackTrace": " at ProjectName.Controllers (etc....)"
}

我认为我更喜欢后者,因为它为您提供了更多调试信息,但它消除了自定义消息或为问题提供用户可读消息的能力。

为什么 WebAPI 与它处理异常的方式不一致?我是否自己在做一些事情来导致这种不一致?它看起来相当混乱且难以使用,并且可能意味着必须对调用应用程序进行编码以处理两种不同类型的错误响应:(

4

2 回答 2

2

创建错误响应时,请考虑使用 HttpRequestMessage.CreateErrorResponse 创建与 WebAPI 发送的错误响应一致的错误响应。

这篇博文应该会有所帮助:http: //blogs.msdn.com/b/youssefm/archive/2012/06/28/error-handling-in-asp-net-webapi.aspx

于 2012-12-01T01:53:39.593 回答
0

我会使用消息处理程序。消息处理程序是一个接收 HTTP 请求并返回 HTTP 响应的类。因此,您基本上可以在一个地方更改响应结构,并且对成功和失败以及 Web Api 中的所有请求都有相同的响应。您可以在我的博客文章中了解它:https ://www.vladopandzic.com/asp-net-web-api/building-consistent-responses-asp-net-web-api/

于 2017-09-12T10:58:24.657 回答