2014-04-11 77 views
28

我有一個Web API項目,對我的方法總是返回HttpResponseMessageWeb API最佳方法返回HttpResponseMessage

所以,如果它的工作原理或失敗我回:

沒有錯誤:

return Request.CreateResponse(HttpStatusCode.OK,"File was processed."); 

任何錯誤或失敗

return Request.CreateResponse(HttpStatusCode.NoContent, "The file has no content or rows to process."); 

當我返回一個對象,然後我用途:

return Request.CreateResponse(HttpStatusCode.OK, user); 

我想知道我怎麼能回到我的HTML5客戶端更好的封裝respose,這樣我就可以返回有關該交易的更多信息,等

我想創建一個自定義的類,它可以封裝HttpResponseMessage,但也有更多的數據。

有沒有人實施過類似的東西?

+0

您不應該在HttpStatusCode.NoContent中使用任何內容。 – kappadoky

+0

通常,如果您使用'HttpStatusCode.NoContent'返回一個HttpActionResult,它將會 - 意外 - 不會返回任何內容,即使您傳遞的字符串類似上面的情況。可能是一個令人驚訝的錯誤。就像下面的用戶BigTone的答案一樣。 根據規範,這也是有意義的https://httpstatuses.com/204'由於不能包含郵件正文,所以204響應被頭字段後面的第一個空行終止。' – mmcrae

回答

32

雖然這不是直接回答問題,但我想提供一些我發現有用的信息。 http://weblogs.asp.net/dwahlin/archive/2013/11/11/new-features-in-asp-net-web-api-2-part-i.aspx

HttpResponseMessage已經或多或少被IHttpActionResult所取代。它更簡潔易用。

public IHttpActionResult Get() 
{ 
    Object obj = new Object(); 
    if (obj == null) 
     return NotFound(); 
    return Ok(obj); 
} 

然後你可以封裝來創建自定義的。 How to set custom headers when using IHttpActionResult?

我還沒有找到實現自定義結果的需求,但是當我這樣做的時候,我會走這條路。

它可能非常類似於使用舊版本。

要進一步擴大這一點,並提供更多的信息。您也可以在一些請求中包含消息。例如。

return BadRequest("Custom Message Here"); 

你不能對許多其他人做這件事,但有助於你想要發回的常見信息。

+2

感謝你,我永遠不會再次使用可怕的HttpResponseMessage – LastTribunal

4

您可以返回錯誤響應以提供更多詳細信息。

public HttpResponseMessage Get() 
{ 
    HttpError myCustomError = new HttpError("The file has no content or rows to process.") { { "CustomErrorCode", 42 } }; 
    return Request.CreateErrorResponse(HttpStatusCode.BadRequest, myCustomError); 
} 

將返回:

{ 
    "Message": "The file has no content or rows to process.", 
    "CustomErrorCode": 42 
} 

更多細節在這裏:http://blogs.msdn.com/b/youssefm/archive/2012/06/28/error-handling-in-asp-net-webapi.aspx

我也用http://en.wikipedia.org/wiki/List_of_HTTP_status_codes幫助我確定哪些HTTP狀態代碼返回。

2

一個重要的注意事項:不要把內容放在204響應!它不僅違反HTTP規範,而且如果你這樣做的話,.NET實際上可能會以意想不到的方式行事。

我錯誤地使用了return Request.CreateResponse(HttpStatusCode.NoContent, null);,它導致了一個真正的頭痛;來自同一會話的未來請求會由於在響應中預設了"null"字符串值而中斷。我想.NET並不總是完全清除來自同一會話的API調用的響應對象。

+0

通常,如果您使用'HttpStatusCode.NoContent'返回一個HttpActionResult,它將會 - 意外 - 不會返回任何內容,即使您傳遞的內容類似於上述OP的情況。可能是一個令人驚訝的錯誤。 – mmcrae

相關問題