2013-10-09 61 views
1

我使用的是asp.net網頁api,我不知道我是否做錯了什麼,但是我發現它出於某種原因使用DataAnnotations進行WebApi vs MVC驗證更加困難。驗證對於WebApi?

例如,如果我想在非字符串上使用必需的驗證器,我必須使用帶有IsRequired的DataContract,我發現它會增加混亂。

我還發現,如果數據註釋無法驗證我真的沒有收到錯誤(RestSharp認爲一切正常)。

我想知道人們使用WebApi的DataAnnotations以外的任何東西嗎?我知道在MVC中有.net的Fluent Validation,但不確定它是否適用於WebApi。

編輯

我在評論的鏈接有點糊塗了基礎。

在第一部分中,他們有這個


if (ModelState.IsValid) 
{ 
    // Do something with the product (not shown). 

    return new HttpResponseMessage(HttpStatusCode.OK); 
} 
else 
{ 
    return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState); 
} 

我想Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);將所有的模型狀態錯誤送回去。

但後來它去

處理驗證錯誤

的Web API並當 驗證失敗時不會自動錯誤返回給客戶端。由控制器的操作來檢查模型 狀態並做出適當的響應。

我對上述行感到困惑,就像我說過的,我認爲CreateErrorResponse正在處理該行。

+0

對不起,如果我錯了,但我覺得這個鏈接很有用:http://www.asp.net/web-api/overview/formats-and-model-binding/model-validation-in-aspnet- web-api – Vladimir

+0

@VladimirFrolov - 非常感謝,但我對某些東西有些困惑。我將以OP結束。 – chobo2

+0

關於處理驗證錯誤:教程中提出了兩種方法。正如你所說,第一個是控制器內部的Request.CreateErrorResponse。第二種是將過濾器屬性應用於控制器或使用全局過濾器。過濾器內部類似於'actionContext.Request.CreateErrorResponse'。 「Web API不會自動向客戶端返回錯誤」意味着在默認配置(即沒有過濾器或模型狀態檢查控制器內部)的情況下,您將不會獲得驗證錯誤信息。 – Vladimir

回答

2

關於您[DataContract(IsRequired = true)]的問題,SO本身有一些文章描述了爲什麼需要(安全問題)以及爲什麼它不再需要(buggy)。 參考:Validation datacontract and datamember required

上DataAnnotation屬性IST從網絡API配置刪除InvalidModelValidatorProvider,像這樣所有你需要做的,只能依靠:

config.Services.RemoveAll(typeof(ModelValidatorProvider), (provider) => provider is InvalidModelValidatorProvider);

其實你是對的,這條線

return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState); 

會將您的驗證錯誤發送回客戶端。您引用的摘錄的含義是,您必須將此行寫入控制器的操作主體或驗證過濾器中。

希望它有幫助。