2012-08-14 58 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框。
相關問題