5

我在处理 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;
}

但是在空 id 的情况下,VS2010 会产生另一个错误,例如

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

我该如何解决这个问题

提前致谢....

4

4 回答 4

3

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

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

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

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

于 2013-05-24T07:56:35.487 回答
2

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

于 2012-08-14T07:31:38.027 回答
1

我只是将参数更改为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;
}
于 2013-09-11T09:48:22.090 回答
0

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

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

  1. 从菜单中,转到 DEBUG -> Exceptions...
  2. 在异常对话框中,将“System.Web.Http.HttpResponseException”添加到公共语言运行时异常树。
  3. 取消选中新的 System.Web.Http.HttpResponseException 的用户未处理框。
于 2015-06-09T22:30:28.633 回答