發(fā)文章
發(fā)文工具
撰寫
網(wǎng)文摘手
文檔
視頻
思維導(dǎo)圖
隨筆
相冊
原創(chuàng)同步助手
其他工具
圖片轉(zhuǎn)文字
文件清理
AI助手
留言交流
前言
閱讀本文之前,您也可以到Asp.Net Web API 2 系列導(dǎo)航進(jìn)行查看 http://www.cnblogs.com/aehyok/p/3446289.html
本文參考鏈接文章地址http://www./web-api/overview/formats-and-model-binding/model-validation-in-aspnet-web-api
當(dāng)客戶端發(fā)送數(shù)據(jù)給你的Web API時,你通常希望在做其它處理之前先對數(shù)據(jù)進(jìn)行驗(yàn)證。
Data Annotations——數(shù)據(jù)注解
在ASP.NET Web API中,你可以使用System.ComponentModel.DataAnnotations命名空間的注解屬性來設(shè)置模型屬性的驗(yàn)證規(guī)則??紤]以下模型:
public class Product { public int Id { get; set; } [Required] public string Name { get; set; } public decimal Price { get; set; } [Range(0,999)] public double Weight { get; set; } }
如果你曾在ASP.NET MVC中使用過模型驗(yàn)證,這看上去是類似的。Required注解屬性說明Name屬性必須不為空。Range注解屬性說明Weight必須在0-999之間。
假設(shè)客戶端發(fā)送了一個帶有下列JSON表示的POST請求:
{ "Id":4, "Price":2.99, "Weight":5 }
你可以看出,客戶端并未包含被標(biāo)記成required的Name屬性。當(dāng)Web API將該JSON轉(zhuǎn)換成Product實(shí)例時,它會根據(jù)這些驗(yàn)證注解屬性對Product進(jìn)行驗(yàn)證。在控制器動作中,你可以檢查該模型是否有效:
public class ProductsController : ApiController { public HttpResponseMessage Post(Product product) { if (ModelState.IsValid) { // Do something with the product (not shown). // 用product做一些事(未表示出來) return new HttpResponseMessage(HttpStatusCode.OK); } else { return new HttpResponseMessage(HttpStatusCode.BadRequest); } } }
模型驗(yàn)證并不保證客戶端數(shù)據(jù)是安全的。在應(yīng)用程序的其它層面可能會需要附加驗(yàn)證(例如,數(shù)據(jù)層可能會強(qiáng)制外鍵約束)。
{"Id":4, "Name":"Gizmo"}
此處,客戶端并未指定Price或Weight的值。JSON格式化器會將默認(rèn)值(這里是零)賦給這些缺失的屬性。
“Under-Posting(遞交不足)”:當(dāng)客戶端遺漏了某些屬性時,便會發(fā)生“Under-posting”。例如,假設(shè)客戶端發(fā)送如下:
此時模型的狀態(tài)是有效的,因?yàn)榱闶沁@些屬性的有效值。這是否是一個問題取決于你所處的場景。例如,在一個更新操作中,你可能希望區(qū)分出“零”與“未設(shè)置”。為了強(qiáng)迫客戶端要設(shè)置一個值,將該屬性構(gòu)造成nullable(可空的),并設(shè)置Required注解屬性:
[Required] public decimal? Price { get; set; }
“Over-Posting(過份遞交)”:客戶端也可能發(fā)送比期望還多的數(shù)據(jù)。例如:
{"Id":4, "Name":"Gizmo", "Color":"Blue"}
此處,JSON包含了Product模型中存在的屬性(“Color”)。在這種情況下,JSON格式化器會簡單地忽略該值(XML格式化器卻不同)。若你的模型具有只讀屬性,Over-posting會產(chǎn)生問題。例如:
public class UserProfile { public string Name { get; set; } public Uri Blog { get; set; } public bool IsAdmin { get; set; } // uh-oh!(啊哦!) }
如果你不想讓用戶對IsAdmin屬性進(jìn)行更新,并將其提升給管理員。最安全的策略是使用一個與允許客戶端發(fā)送嚴(yán)格匹配的模型類:
public class UserProfileDTO { public string Name { get; set; } public Uri Blog { get; set; } // Leave out "IsAdmin" // 略去了"IsAdmin" }
Handling Validation Errors——處理驗(yàn)證錯誤
當(dāng)驗(yàn)證失敗時,Web API并不會自動地將錯誤返回給客戶端。這取決于控制器動作對模型狀態(tài)及響應(yīng)進(jìn)行適當(dāng)?shù)臋z查。
你也可以創(chuàng)建一個動作過濾器,以便在控制器動作被調(diào)用之前,檢查模型的狀態(tài)。以下代碼演示了一個例子:
using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http.Controllers; using System.Web.Http.Filters; using System.Web.Http.ModelBinding; public class ModelValidationFilterAttribute : ActionFilterAttribute { public override void OnActionExecuting(HttpActionContext actionContext) { if (actionContext.ModelState.IsValid == false) { // Return the validation errors in the response body. // 在響應(yīng)體中返回驗(yàn)證錯誤 var errors = new Dictionary<string, IEnumerable<string>>(); foreach (KeyValuePair<string, ModelState> keyValue in actionContext.ModelState) { errors[keyValue.Key] = keyValue.Value.Errors.Select(e => e.ErrorMessage); } actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, errors); } } }
如果模型驗(yàn)證失敗,此過濾器會返回一個含有驗(yàn)證錯誤的HTTP響應(yīng)。在此情況下,不會調(diào)用控制器動作。
HTTP/1.1 400 Bad Request Server: ASP.NET Development Server/10.0.0.0 Date: Fri, 20 Jul 2012 21:42:18 GMT Content-Type: application/json; charset=utf-8 Content-Length: 239 Connection: Close { "product": [ "Required property 'Name' not found in JSON. Line 1, position 18." ], "product.Name": [ "The Name field is required." ], "product.Weight": [ "The field Weight must be between 0 and 999." ] }
如果你正在使用CodePlex上最新版的Web API,可以使用HttpError類將驗(yàn)證錯誤返回給客戶端。HttpError類在RC版(指Web API的預(yù)覽版)中無效。
你可以將此過濾器全局性地運(yùn)用于所有Web API控制器。在Application_Start方法中,將此過濾器添加到HttpConfiguration.Filters集合:
protected void Application_Start() { // ... GlobalConfiguration.Configuration.Filters.Add(new ModelValidationFilterAttribute()); }
另一種可選辦法是,通過將此過濾器作為注解屬性進(jìn)行添加,你可以將它運(yùn)用于個別控制器或控制器動作:
public class ProductsController : ApiController { [ModelValidationFilter] public HttpResponseMessage Post(Product product) { // ... } }
來自: 昵稱10504424 > 《工作》
0條評論
發(fā)表
請遵守用戶 評論公約
ASP.NET Web API現(xiàn)使用Json.NET,獲得若干增強(qiáng)
ASP.NET Web API現(xiàn)使用Json.NET,獲得若干增強(qiáng)。ASP.NET Web API發(fā)布候選版獲得了若干增強(qiáng),如將Json.NET作為默認(rèn)的序列化器,可測試性更好的Http消息處理器,以及IAPIExplorer API等等。
ASP.NET 實(shí)現(xiàn)多站點(diǎn)統(tǒng)一登錄
ASP.NET 實(shí)現(xiàn)多站點(diǎn)統(tǒng)一登錄現(xiàn)在網(wǎng)絡(luò)上的身份驗(yàn)證一般都是采用用戶名+口令的形式,幾乎每到一個提供服務(wù)的網(wǎng)站都要求進(jìn)行驗(yàn)證登錄。我們知道Http是無連接協(xié)議, 而Cookie可以標(biāo)識特定站點(diǎn)的用戶信息, A...
ASP.NET Web API(二):安全驗(yàn)證之使用HTTP基本認(rèn)證
ASP.NET Web API(二):安全驗(yàn)證之使用HTTP基本認(rèn)證。HTTP基本認(rèn)證原理。在HTTP協(xié)議進(jìn)行通信的過程中,HTTP協(xié)議定義了基本認(rèn)證過程以允...
模組化的 IIS 7 與 .NET 能力整合
IIS(Internet Information Services)不僅是 Windows Server 的重要功能,Windows 用戶端作業(yè)系統(tǒng)也有這項(xiàng)功能,而 Windows Vista 以及...
ASP.NET MVC隨想錄(1):漫談OWIN
OWIN在.NET Web Servers與Web Application之間定義了一套標(biāo)準(zhǔn)接口,OWIN的目標(biāo)是用于解耦Web Server和Web Application。過去,IIS作為.N...
VS2005將支持的兩種WEB編程模型的比較
VS2005將支持的兩種WEB編程模型的比較 2006年4月17日 14:02上篇Blog我介紹了Visual Studio 2005 Web Application Projects 項(xiàng)目,下面來比較一下它跟 Visual Studio 2005 Web Site Projects 使用的場...
ASP.NET MVC的Web Api的實(shí)練
ASP.NET MVC的Web Api的實(shí)練。學(xué)習(xí)ASP.NET MVC一年多來,現(xiàn)在該學(xué)學(xué)Web Api了。API與ASP.NET MVC的Controller差不多。當(dāng)你在專案中創(chuàng)建...
VS2008 Web Application和Web Site的區(qū)別[轉(zhuǎn)] - 無名 - ...
VS2008 Web Application和Web Site的區(qū)別[轉(zhuǎn)] - 無名 - ...編譯(Build)命令僅僅是測試這個WEB站點(diǎn)是否編譯正確,調(diào)試一個WEB站點(diǎn)項(xiàng)目的時候,是通過依賴你的源代碼文件,ASP.net進(jìn)行動態(tài)編譯頁面和類...
WCF-安全之身份驗(yàn)證與授權(quán)
WCF-安全之身份驗(yàn)證與授權(quán)。某些網(wǎng)關(guān)守衛(wèi)(例如 ASP.NET 文件授權(quán)、企業(yè)服務(wù) (COM+) 角色和 Windows ACL)要求經(jīng)過身份驗(yàn)證的 Windows 標(biāo)識,此類標(biāo)識采用 WindowsIdentity 對象的形式,該對象封裝的是...
微信掃碼,在手機(jī)上查看選中內(nèi)容