【问题标题】:Returning Errors in Web API在 Web API 中返回错误
【发布时间】:2013-05-21 06:44:27
【问题描述】:

我正在使用 ASP.NET Web API 开发一个全新的 REST API。来自 WCF 背景,我很喜欢为我的 API 创建“错误契约”。

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

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

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

不过,我的 API 也大量使用了自动模型验证,这些模型验证错误会以完全不同的结构返回。

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

最后,我的 API 将公开 json、xml 和协议缓冲区的格式化选项。因此,我真的需要确保我的策略是独立于格式化程序的。

【问题讨论】:

    标签: asp.net-web-api


    【解决方案1】:

    我不久前写过这篇关于 Web API 如何处理错误的博文:

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

    它应该有助于回答您的问题。本质上,您有两个选择:

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

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

    【讨论】:

    • 你能提供更多关于 HttpError 的信息以及返回它的最佳方式吗?它仍然是返回错误的标准方式吗?我几乎找不到它-谢谢。它似乎也不适用于 IHttpActionResult。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-10-01
      • 2018-01-16
      • 2017-04-01
      • 1970-01-01
      • 2017-05-28
      • 2013-04-21
      • 2016-09-16
      • 2018-05-14
      • 2014-05-01
      相关资源
      最近更新 更多