Asp.net mvc 4 HttpResponseException
在处理MVC4WebAPI中的错误时,我面临一个大问题。在这里,我想验证传入的请求并发回一个BadRequest响应 为此,我正在使用代码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
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仍将打破这些例外。要禁用此功能,请执行以下操作:
您使用哪个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;
}