HttpResponseException

时间:2012-08-14 07:05:53

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

我在处理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响应以获取详细信息。”

如何解决此问题

提前致谢....

4 个答案:

答案 0 :(得分:3)

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

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

在Web服务器上安装代码后,如果不存在匹配的记录,则只会返回404错误。

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

答案 1 :(得分:2)

使用路由约束来禁用null ID:@"\d+"。这样,如果您未在URL中传递数字ID,则控制器操作甚至无法解决,并且路由引擎将直接返回404。

答案 2 :(得分:0)

我只想将参数更改为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;
}

答案 3 :(得分:0)

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

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

  1. 从菜单中,转到DEBUG - >例外...
  2. 在“例外”对话框中,添加" System.Web.Http.HttpResponseException"到Common Language Runtime Exceptions树。
  3. 取消选中新的System.Web.Http.HttpResponseException用户未处理的复选框。