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