HttpResponseException

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为null,在VS2010中会产生另一个错误,如:

"处理HTTP请求时发生异常。请查看此异常的'Response'属性返回的HTTP响应以获取详细信息"。

我该如何解决这个问题?

提前感谢您的帮助...


你使用了哪个URL来调用GetProduct动作? - cuongle
4个回答

3

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

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

一旦将您的代码安装在Web服务器上,如果没有匹配的记录,则会简单地返回404错误。

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


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Andy
@Andy:在你的web.config文件中(在系统.web部分),打开调试选项,这样错误细节就不会被遮挡(这是一种安全预防措施,以防止您的代码被暴露)。 - iCollect.it Ltd

2

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


HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound)) 的目的是在 REST 请求中,如果没有匹配的记录,则抛出异常以产生 404 错误。约束只验证值的类型,而不验证是否存在与该值匹配的记录。我已经添加了一个答案来解决这个问题。 - iCollect.it Ltd

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;
}

0
http://www.asp.net/web-api/overview/error-handling/exception-handling所述,未捕获/未处理的异常默认会转换为HTTP响应。抛出HttpResponseException允许您指定该HTTP响应的许多内容(例如404未找到状态码)。
正如TrueBlueAussie所提到的,Visual Studio仍会在这些异常上中断。要禁用此功能:
  1. 从菜单中进入DEBUG -> Exceptions...
  2. 在异常对话框中,将"System.Web.Http.HttpResponseException"添加到公共语言运行时异常树中。
  3. 取消选中新的System.Web.Http.HttpResponseException的用户未处理框。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接