【问题标题】:HttpResponseExceptionHttpResponseException
【发布时间】:2012-08-14 07:05:53
【问题描述】:

我在处理 MVC 4 webAPI 中的错误时遇到了一个大问题。在这里,我想验证传入的请求并返回一个 BadRequest 响应。

为此,我正在使用代码

public Product GetProduct(int id)
{
    Product item = repository.Get(id);
   if (item == null)
   {
     throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
   }
   return item;
}

但是如果是null id,VS2010会产生另一个类似的错误

“处理 HTTP 请求导致异常。有关详细信息,请参阅此异常的 'Response' 属性返回的 HTTP 响应”。

我该如何解决这个问题

提前谢谢....

【问题讨论】:

  • 您使用哪个 URL 调用操作 GetProduct?

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


【解决方案1】:

您的代码实际上是正确的。您所看到的是 Visual Studio 坚持捕获未处理的异常(即在您的应用程序中未处理)。

HttpResponseException 异常由调用您的 Web API 的路由处理,您的代码只会生成 404 错误。

在 Web 服务器上安装代码后,如果不存在匹配记录,它将简单地返回 404 错误。

虽然关于使用约束的建议对于基本检查很有用,但 404 的真正用途是报告数据库中不存在特定的请求条目(而不是 URL 中不存在)。

【讨论】:

  • 我使用了类似的代码来抛出一个 HttpResponseException 但我仍然得到一个黄屏死机(在实时服务器上)“处理 HTTP 请求导致异常......”你呢知道如何绕过这个无用的信息吗?谢谢
  • @Andy:打开 web.config 中的调试选项(在 system.web 部分中),以便不掩盖错误详细信息(这是一种安全预防措施,因此您的代码不会暴露) .
【解决方案2】:

使用路由约束禁用null ids:@"\d+"。这样,如果您没有在 url 中传递数字 id,控制器操作甚至不会解析,并且路由引擎将直接返回 404。

【讨论】:

  • HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound)) 的目的是抛出异常以产生 404 错误如果没有匹配的记录用于 REST 请求。约束仅验证值的类型,而不验证该值是否存在匹配记录。我已经添加了一个答案来解决这个问题。
【解决方案3】:

我只是将参数更改为int?然后进行 HasValue 检查并抛出所需的异常。像这样(假设你想抛出同样的异常):

public Product GetProduct(int? id)
{
    Product item;
    if (id.HasValue){
        item = repository.Get(id);
    }
    if (item == null)
    {
        throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
    }
    return item;
}

【讨论】:

    【解决方案4】:

    http://www.asp.net/web-api/overview/error-handling/exception-handling 中所述,未捕获/非用户处理的异常默认转换为 HTTP 响应。抛出 HttpResponseException 允许您指定该 HTTP 响应的大部分内容(例如 404 Not Found 状态代码)。

    正如 TrueBlueAussie 所提到的,Visual Studio 仍将中断这些异常。要禁用此功能:

    1. 从菜单中,转到调试 -> 例外...
    2. 在“异常”对话框中,将“System.Web.Http.HttpResponseException”添加到公共语言运行时异常树。
    3. 取消选中新 System.Web.Http.HttpResponseException 的用户未处理框。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-13
      • 2012-05-26
      相关资源
      最近更新 更多