2012-08-14 71 views
4

我面临着处理MVC 4 webAPI中的错误的大问题。在这里,我想验证传入的请求并发回BadRequest响应。HttpResponseException

对于我使用的代码

public Product GetProduct(int id) 
{ 
    Product item = repository.Get(id); 
    if (item == null) 
    { 
    throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound)); 
    } 
    return item; 
} 

但在空号的情况下,VS2010会产生像

“HTTP请求导致的异常处理其他错误,请查看HTTP详情请参阅此例外的'Response'属性返回的响应。

我该如何解决这个问题提前

感谢....

+0

您用哪个URL调用操作GetProduct? – 2012-08-14 07:42:18

回答

2

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

+0

'HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound))'的目的是抛出一个异常,如果REST请求没有匹配的记录,则产生一个404错误*。约束条件仅验证值的类型,而不验证该值是否存在匹配的记录。我已经添加了一个答案来说明这一点。 – 2013-05-24 07:58:45

3

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

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

在Web服务器上安装代码后,如果没有匹配的记录,它将直接返回404错误。

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

+0

我已经使用类似的代码来抛出一个HttpResponseException,但我仍然得到了一个黄色的死亡屏幕(在一个活着的服务器上)“处理HTTP请求导致了一个异常......”你知道我怎么能绕过这无益的信息?谢谢 – Andy 2014-12-23 17:47:23

+0

@Andy:打开web.config(在system.web部分)中的调试选项,以避免错误细节被屏蔽(这是一种安全措施,以防止代码泄露)。 – 2014-12-24 12:13:51

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

如描述的那样,http://www.asp.net/web-api/overview/error-handling/exception-handling,未捕获/ unuser-处理的异常默认情况下,转换成HTTP响应。抛出HttpResponseException允许您指定大部分此HTTP响应(例如404 Not Found状态码)。

正如TrueBlueAussie所提到的,Visual Studio仍然会破解这些异常。要禁用此:

  1. 从菜单,进入DEBUG - >例外...
  2. 在例外对话框中,添加“System.Web.Http.HttpResponseException”的公共语言运行库异常树。
  3. 取消选中新的System.Web.Http.HttpResponseException的User-unhandled框。
相关问题