首页 文章

返回Web API中的错误

提问于
浏览
10

我正在使用ASP.NET Web API开发一个全新的REST API . 来自WCF背景,我觉得为我的API创建“错误 Contract ” .

在这种情况下,我不是在谈论返回给客户端的未处理异常 . 相反,我专注于错误,例如客户端不正确地使用API - 尤其是客户端可以自动创建这些错误并重新提交请求的错误 .

我发现的大多数示例都只返回一个字符串,通常是通过抛出HttpResponseException,或者至少做一些事情来使构建信息性错误字符串的过程更加自动化:Return custom error objects in Web API

我正在考虑创建一个HttpResponseException,传入一个HttpResponseMessage,其内容设置为我的特定错误 Contract 类型 .

我的API也在大量使用自动模型验证,而这些模型验证错误又以完全不同的结构形式出现 .

那么我应该将“错误”强制为与模型验证响应相同的格式吗?这里的最佳做法是什么?

最后,我的API将公开json,xml和协议缓冲区的格式化选项 . 因此,我确实需要确保我的策略与格式化程序无关 .

2 回答

  • 19

    在这些情况下,您可以做任何您想做的事情 . 对于web api的消费者来说,最好的体验是确保使用友好的错误消息,在这种情况下,您需要将错误序列化为格式良好的json对象 . 以下博客文章提供了一些用例和我提出的解决方案:Web Api, HttpError and the Behavior of Exceptions

  • 1

    我之前写了一篇关于Web API如何处理错误的博客文章:

    http://blogs.msdn.com/b/youssefm/archive/2012/06/28/error-handling-in-asp-net-webapi.aspx

    它应该有助于回答您的问题 . 基本上,您有两种选择:

    • 为错误响应定义自己的类 . 在这种情况下,您希望确保您的类可以序列化为XML,JSON等 . 然后您可以使用 Request.CreateResponse(statusCode, myErrorInstance) 发回自定义错误 . 您可能还想要一种将无效模型状态转换为特定错误类型的方法 .

    • 使用Web API的错误响应类型: HttpError . HttpError本质上是一个 Dictionary<string, object> ,您可以将自己的键和值添加到HttpError中 . 优点很多 - 您的错误看起来像Web API错误,您知道它适用于所有格式化程序,您可以避免必须定义异常和无效模型状态的转换 . 使用HttpError的最简单方法是调用 Request.CreateErrorResponse() .

相关问题