在ASP.NET Web API中,如果抛出异常,如何使HTTP响应语法保持一致?

时间:2012-11-30 12:21:46

标签: asp.net-mvc-4 asp.net-web-api

我正在使用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与处理异常的方式不一致?我自己做些什么导致这种不一致吗?它似乎相当混乱,难以使用,可能意味着调用应用程序必须编码以处理两种不同类型的错误响应:(

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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