天天看點

Asp.Net Web API 2第十五課——Model Validation(模型驗證)

前言

當用戶端發送資料給你的Web API時,你通常希望在做其它處理之前先對資料進行驗證。

Data Annotations——資料注解

 在ASP.NET Web API中,你可以使用System.ComponentModel.DataAnnotations命名空間的注解屬性來設定模型屬性的驗證規則。考慮以下模型:

如果你曾在ASP.NET MVC中使用過模型驗證,這看上去是類似的。Required注解屬性說明Name屬性必須不為空。Range注解屬性說明Weight必須在0-999之間。

假設用戶端發送了一個帶有下列JSON表示的POST請求:

你可以看出,用戶端并未包含被标記成required的Name屬性。當Web API将該JSON轉換成Product執行個體時,它會根據這些驗證注解屬性對Product進行驗證。在控制器動作中,你可以檢查該模型是否有效:

模型驗證并不保證用戶端資料是安全的。在應用程式的其它層面可能會需要附加驗證(例如,資料層可能會強制外鍵限制)。

此處,用戶端并未指定Price或Weight的值。JSON格式化器會将預設值(這裡是零)賦給這些缺失的屬性。

“Under-Posting(遞交不足)”:當用戶端遺漏了某些屬性時,便會發生“Under-posting”。例如,假設用戶端發送如下:

此時模型的狀态是有效的,因為零是這些屬性的有效值。這是否是一個問題取決于你所處的場景。例如,在一個更新操作中,你可能希望區分出“零”與“未設定”。為了強迫用戶端要設定一個值,将該屬性構造成nullable(可空的),并設定Required注解屬性:

“Over-Posting(過份遞交)”:用戶端也可能發送比期望還多的資料。例如:

此處,JSON包含了Product模型中存在的屬性(“Color”)。在這種情況下,JSON格式化器會簡單地忽略該值(XML格式化器卻不同)。若你的模型具有隻讀屬性,Over-posting會産生問題。例如:

如果你不想讓使用者對IsAdmin屬性進行更新,并将其提升給管理者。最安全的政策是使用一個與允許用戶端發送嚴格比對的模型類:

Handling Validation Errors——處理驗證錯誤

 當驗證失敗時,Web API并不會自動地将錯誤傳回給用戶端。這取決于控制器動作對模型狀态及響應進行适當的檢查。

你也可以建立一個動作過濾器,以便在控制器動作被調用之前,檢查模型的狀态。以下代碼示範了一個例子:

如果模型驗證失敗,此過濾器會傳回一個含有驗證錯誤的HTTP響應。在此情況下,不會調用控制器動作。

你可以将此過濾器全局性地運用于所有Web API控制器。在Application_Start方法中,将此過濾器添加到HttpConfiguration.Filters集合:

另一種可選辦法是,通過将此過濾器作為注解屬性進行添加,你可以将它運用于個别控制器或控制器動作: