2015-11-17 63 views
4

我正在開發基於MVC5/Web API的應用程序。在我讀過的一些文章中,使用Contract.RequiresSystem.Diagnostics.Contracts命名空間的一部分)來驗證傳入數據。Contract.Request的驗證在網絡api

這是驗證傳入數據的正確方法嗎?此外,我無法調試Contract.Requires行,因爲調試器始終繞過此行。我使用Visual Studio 2013年

public async Task<UserInfo> Put(
     [FromBody] UserInfo userInfo) { 
     Contract.Requires(userInfo != null); 
     .............. 
    } 

有人能解釋時使用Contract.Requires何避免?

+1

https://msdn.microsoft.com/en-我們/庫/ dd264808.aspx。 – Claies

回答

3

您當然可以在您的控制器中使用代碼合同,但這裏有一些缺點和原因,您可能不需要合同。在API響應

  • 損失的錯誤細節: A碼合約發生故障時將返回給客戶端作爲HTTP 500內部服務器錯誤,有可能不加詳細說明,這是不利於API的客戶。這是因爲合同失敗導致拋出異常。您可能更願意拋出一個HttpResponseException來代替自己的細節,或者定製一個HttpResponseMessage。在這種情況下(除非你推出自己的全局異常處理)代碼合同可能沒有意義。

  • Contract.Requires可能是多餘的:請考慮Web API如何驗證您的參數。例如,缺少的參數可能會導致無效的路由,所以請求被拒絕並且方法不會被調用。代碼合同在這種方法中是無用的。

  • 爲什麼你需要合同?代碼合同非常適合在編譯時捕獲合同失敗。但除非你的API客戶端也是.NET項目,否則你不能利用該功能。所以考慮你可能需要什麼合同來做,如果這證明了他們的用法。

3

爲什麼要簽約?

您可以在API的方法使用HttpResponseMessage:

[HttpPost] 
    public HttpResponseMessage Put(UserInfo userInfo) { 
    if(ModelState.IsValid) 
    { 
    // your code 
    return Request.CreateResponse(HttpStatusCode.OK); 
    } 
    else 
    { 
    return Request.CreateResponse(HttpStatusCode.BadRequest, new { msg = "invalid data" }); 
    } 
    } 

和或:

[HttpPost] 
     public async Task<ActionResult> Put(UserInfo userInfo) { 
     if(ModelState.IsValid) 
     { 
     // your code 
     return Request.CreateResponse(HttpStatusCode.OK); 
     } 
     else 
     { 
     return Request.CreateResponse(HttpStatusCode.BadRequest, new { msg = "invalid data" }); 
     } 
     } 
2

雖然基斯指出,使用代碼契約中Web.Api我想分享一些想法的一些感知缺點在哪裏他們可能有意義或派上用場。

使用代碼合約你有一個關於如何做輸入驗證和參數驗證(如斷言甚至是後置條件)的標準方法。 這意味着你可以用相同的方式進行編碼 - 無論你是在ApiController中還是在其他代碼片段中(例如異步工作者線程)。

當然,發送給客戶端的一般HTTP 500消息沒有什麼幫助,因此我們使用Code Contracts與標準Web.Api異常處理程序(HttpStatusExceptionFilterAttribute)結合使用。此異常處理程序將檢查消息並將自定義HTTP錯誤代碼發送回客戶端(可選地還有失敗的情況),並且可以將完整的堆棧跟蹤記錄到中央應用程序的日誌工具中。

通過利用這兩個功能,您可以清理並精簡代碼,同時向客戶端提供友好且有意義的錯誤信息,並仍保留完整的錯誤信息以進行內部故障排除。

你可以看看這篇文章,解釋它遠一點:Using CodeContracts with OData Controllers and Web.Api Exception Filters

希望這有助於

問候,羅納德