2013-10-30 29 views
0

我有ASP.NET網頁API控制器的這個例子:如何在不使用HttpResponseMessage時更改響應代碼?

public Mea Get(Int32 id) 
    { 
     try 
     { 
      return Meas.GetById(id) ?? new Mea(-1, 0D, 0D); 
     } 
     catch (Exception) 
     { 
      return new Mea(-1, 0D, 0D); 
     } 
    } 

我希望能夠返回不同的響應代碼,如果GetById返回null或捕獲異常。 我看到的所有示例都使用HttpResponseMessage,您可以在其中添加響應代碼。 我的問題是如何在不使用HttpResponseMessage時更改響應代碼,如上例所示?

+0

,我不認爲這是可以做到。你爲什麼不喜歡'HttpResponseMessage'? – sunil

+0

@sunil它只是關於編碼的便利,當你看看方法聲明時,你會看到它返回的內容,而不僅僅是一個通用的HttpResponseMessage ... – user1615362

回答

0

您可以拋出System.Web.Http.HttpResponseException,指定要返回給客戶端的HTTP狀態碼和/或可選的整個HttpResponseMessage

1

那麼如果你想要從你的函數返回不同的響應代碼,那麼你將不得不把它包裝在HttpResponseMessage

您的功能將始終返回狀態碼「200」。即使你返回一個裸露的對象,框架管道也會將它轉換爲HttpResponseMessage,默認狀態碼HttpStatusCode.OK,所以你自己做得更好。

我建議的是不要從API函數中返回裸露的對象/值。始終將值包裝在HttpResponseMessage中,然後從您的函數返回響應消息。通過將其包裝在HttpResponseMessage中,您可以在客戶端擁有適當的狀態碼。返回HttpResponseMessage始終是最佳做法。

所以,請改變你的函數類似這樣的

public HttpResponseMessage Get(Int32 id) 
{ 
    try 
    { 
    // on successful execution 
     return this.Request.CreateResponse(HttpStatusCode.OK, Meas.GetById(id) ?? new Mea(-1, 0D, 0D)); 
    } 
    catch (Exception) 
    { 
     return this.Request.CreateResponse(HttpStatusCode.InternalServerError, Mea(-1, 0D, 0D)); 
    } 
} 

在一個錯誤的情況下,你也可以拋出HttpResponseException

+0

爲什麼返回HttpResponseMessage始終是最佳實踐?返回對象有什麼錯誤? – user1615362

+0

@ user1615362:即使你返回一個對象,它也會被框架自動包裝在一個HttpResponseMessage中。通過返回HttpResponseMessage,您可以更好地控制來自api函數的響應,如果將來需要出現,您也可以輕鬆地自定義響應。 – wizzardz

+0

從類型安全角度來看,最好返回一個「對象」。 – user1615362