Asp.net mvc 4 HttpResponseException

Asp.net mvc 4 HttpResponseException,asp.net-mvc-4,asp.net-web-api,Asp.net Mvc 4,Asp.net Web Api,在处理MVC4WebAPI中的错误时,我面临一个大问题。在这里,我想验证传入的请求并发回一个BadRequest响应 为此,我正在使用代码 public Product GetProduct(int id) { Product item = repository.Get(id); if (item == null) { throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.Not

在处理MVC4WebAPI中的错误时,我面临一个大问题。在这里,我想验证传入的请求并发回一个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响应。”

我如何解决这个问题


提前感谢….

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

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

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

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


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

我想把参数改成int?然后执行HasValue检查并抛出所需的异常。如下所示(假设您想要抛出相同的异常):

如中所述,默认情况下,未捕获/未使用处理的异常会转换为HTTP响应。抛出HttpResponseException允许您指定大部分HTTP响应(例如404NotFound状态代码)

正如TrueBlueAusie提到的,VisualStudio仍将打破这些例外。要禁用此功能,请执行以下操作:

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

  • 您使用哪个URL调用action GetProduct?HttpResponseException(新的HttpResponseMessage(HttpStatusCode.NotFound))的目的是在没有REST请求的匹配记录时引发异常以产生404错误。约束仅验证值的类型,而不验证该值是否存在匹配记录。我已经添加了一个答案来说明这一点。我使用了类似的代码抛出了一个HttpResponseException,但我仍然得到了一个黄色的死亡屏幕(在一个实时服务器上),“处理HTTP请求导致了一个异常…”你知道我如何绕过这个没有帮助的消息吗?Thanks@Andy:在web.config(在system.web部分)中启用调试选项,以便不掩盖错误详细信息(这是一种安全预防措施,以便不公开代码)。
    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;
    }