亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

ASP.NET Web API Model-ParameterBinding

2019-11-17 01:46:21
字體:
來源:轉載
供稿:網友

asp.net Web API Model-ParameterBinding

ASP.NET Web API Model-ParameterBinding

前言

通過上個篇幅的學習了解Model綁定的基礎知識,然而在ASP.NET Web API中Model綁定功能模塊并不是被直接調用的,而是要通過本篇要介紹的內容ParameterBinding的一系列對象對其進行封裝調用,通過本篇的學習之后也會大概的清楚在Web API中綁定會有哪幾種方式。

Model-ParameterBinding(對象篇)

在ASP.NET Web API中ParameterBinding代表著參數綁定并且在這其中涉及了幾種綁定的方式,然而ParaMeterBinding并不是單獨執行的,就好比一個控制器方法中有可能會有多個參數一樣,所以我們就先來看一下ActionBinding的相關對象,對于這些對象的生成的環境以及過程我們在后面的篇幅中會有講解。

HttpActionBinding

代碼1-1

namespace System.Web.Http.Controllers{    public class HttpActionBinding    {        public HttpActionBinding();        public HttpActionBinding(HttpActionDescriptor actionDescriptor, HttpParameterBinding[] bindings);        public HttpActionDescriptor ActionDescriptor { get; set; }        public HttpParameterBinding[] ParameterBindings { get; set; }        public virtual Task ExecuteBindingAsync(HttpActionContext actionContext, CancellationToken cancellationToken);    }}

代碼1-1中對于HttpActionBinding類型的定義一目了然,看HttpActionBinding類型的重載構造函數中有HttpActionDescriptor類型、HttpParameterBinding類型的數組類型作為參數,HttpActionDescriptor類型作為控制器方法描述類型大家已經很熟悉了吧,這個類型中包含著控制器方法的元數據信息,而后者HttpParameterBinding類型則是表示著參數綁定對象,其實在Model綁定中每個參數的綁定都是通過ParameterBinding來綁定的,所以這里的執行過程我們暫時不去深入了解,就是單純的了解一下相關的對象模型。

HttpParameterBinding

代碼1-2

namespace System.Web.Http.Controllers{    public abstract class HttpParameterBinding    {        PRotected HttpParameterBinding(HttpParameterDescriptor descriptor);        public HttpParameterDescriptor Descriptor { get; }        public virtual string ErrorMessage { get; }        public bool IsValid { get; }        public virtual bool WillReadBody { get; }        public abstract Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken);        protected object GetValue(HttpActionContext actionContext);        protected void SetValue(HttpActionContext actionContext, object value);    }}

在代碼1-2中我們看到HttpParameterBinding類型的定義,可以看到HttpParameterBinding是抽象類型,并且實現綁定的方法ExecuteBindingAsync()也是抽象的,這也是為了在不同的環境和情況相愛采取不同的綁定機制做好鋪墊就是多態啦,這個我們后面會說,我們還是先看下HttpParameterBinding類型的內部定義,首先我們看到的是構造函數中的參數類型,HttpParameterDescriptor類型,又是一個對象描述類型,這次的描述對象則是控制其方法中的某個參數,而HttpParameterBinding對象實例的生成則是根據HttpParameterDescriptor對象實例而來,這個后續的篇幅中會有講解。ErrorMessage屬性表示在ParameterBinding綁定的過程中出現的錯誤信息,而IsValid屬性表示綁定是否可以完成的依據就是判斷ErrorMessage屬性是否為Null,WillReadBody屬性表示ParameterBinding對象是否讀取Http消息正文內容作為參數綁定的數據源,這個稍后給大家看的示例中就有,一看便知。GetValue()和SetValue()方法就是向當前HttpActionContext中獲取對應的參數值和設置參數對應值。

ModelBinderParameterBinding

代碼1-3

namespace System.Web.Http.ModelBinding{    public class ModelBinderParameterBinding : HttpParameterBinding, IValueProviderParameterBinding    {        public ModelBinderParameterBinding(HttpParameterDescriptor descriptor, IModelBinder modelBinder, IEnumerable<System.Web.Http.ValueProviders.ValueProviderFactory> valueProviderFactories);        public IModelBinder Binder { get; }        public IEnumerable<System.Web.Http.ValueProviders.ValueProviderFactory> ValueProviderFactories { get; }        public override Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken);    }}

代碼1-3表示的是ModelBinderParameterBinding類型,這個類型代表的綁定方式(綁定的數據來源)是通過IModelBinder來獲取的,也就正如代碼1-3中我們看到的構造函數一樣,其中有IModelBinder和ValueProviderFactory類型的集合,這些就是數據綁定的數據源。Binder屬性和ValueProviderFactories屬性也就是構造函數傳入的兩個類型值。對于綁定的細節這里就不說多了。

FormatterParameterBinding

代碼1-4

namespace System.Web.Http.ModelBinding{    public class FormatterParameterBinding : HttpParameterBinding    {        public FormatterParameterBinding(HttpParameterDescriptor descriptor, IEnumerable<MediaTypeFormatter> formatters, IBodyModelValidator bodyModelValidator);        public IBodyModelValidator BodyModelValidator { get; set; }        public override string ErrorMessage { get; }        public IEnumerable<MediaTypeFormatter> Formatters { get; set; }        public override bool WillReadBody { get; }        public override Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken);        public virtual Task<object> ReadContentAsync(HttpRequestMessage request, Type type, IEnumerable<MediaTypeFormatter> formatters, IFormatterLogger formatterLogger);    }}

代碼1-4中所示的FormatterParameterBinding類型是通過哪種方式來獲取綁定數據源的呢?大家可以看到WillReadBody屬性在這個類型中被重寫了,原來在HttpParameterBinding類型中默認為false的是不會對Http請求的正文內容進行讀寫的,而這里在FormatterParameterBinding類型中,已然的重寫了,說明在這個類型中我們所能用到的綁定數據源就是從Http請求的正文內容來讀取了,然而Http請求的正文內容并不是直接放在那里供我們讀取的,而是在客戶端發送前就已經被指定的序列化器序列化了。

那么我們在服務器端就要反序列化才能獲取到值,這里在代碼1-4中我們看到構造函數中可以看到和代碼1-3一樣都是具有一個HttpParameterDescriptor類型的參數對象,而后則是一個MediaTypeFormatter類型的集合對象,最后是進行Model驗證的對象,這個后續再說。

現在我們就來看看第二個參數類型中的MediaTypeFormatter類型。

MediaTypeFormatter

代碼1-5

namespace System.Net.Http.Formatting{    public abstract class MediaTypeFormatter    {        protected MediaTypeFormatter();        public abstract bool CanReadType(Type type);        public abstract bool CanWriteType(Type type);        public virtual Task<object> ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger);        public virtual Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext);    }}

在代碼1-5中所示的MediaTypeFormatter類型是被刪減過的一部分,所剩4個方法中兩個是抽象方法兩個是虛方法,先看兩個抽象方法的定義,CanReadType()方法表示的是根據指定的參數類型從當前的Http請求正文中能否讀取到改類型的值,簡單來說就是能否把正文內容反序列化為指定的參數類型,同理CanWriterType()是對響應正文進行操作判斷。而ReadFromStreamAsync()方法和WriteToStreamAsync()方法則是對Http請求正文內容和Http響應正文內容進行實際操作的兩個方法。

對于MediaTypeFormatter類型的實現類型比如說針對Json格式的JsonMediaTypeFormatter和針對xml格式的XmlMediaTypeFormatter.

我們看一下JsonMediaTypeFormatter類型的簡單示例,大家就會知道是怎么回事了。

首先我們在服務器端的控制器中定義一個接收Post請求的方法,

代碼1-6

        [CustomControllerActionAuthorizationFilter]        public void Post(Product product)        {            products.Add(product);        }

為了方便演示在其控制其方法上加了個授權過濾器,然后我們對Post請求的處理使用JsonMediaTypeFormatter類型進行反序列化的操作將在CustomControllerActionAuthorizationFilter過濾器類型中進行。

代碼1-7

public Task<System.Net.Http.HttpResponseMessage> ExecuteAuthorizationFilterAsync(System.Web.Http.Controllers.HttpActionContext actionContext, System.Threading.CancellationToken cancellationToken, Func<Task<System.Net.Http.HttpResponseMessage>> continuation)        {            Console.WriteLine(actionContext.Request.Content.Headers.ContentType.MediaType);            IEnumerable<MediaTypeFormatter> formatters = new MediaTypeFormatter[]             {                new JsonMediaTypeFormatter()            };            Product product = actionContext.Request.Content.ReadAsAsync<Common.Product>(formatters).Result;            Console.WriteLine(product.ProductID);            Console.WriteLine(product.ProductName);            Console.WriteLine(product.ProductCategory);            return continuation();        }

在代碼1-7中,在請求到達控制器方法之前會先經過授權過濾器,在這其中首先我們是先向服務器端的控制器輸出了當前請求的格式類型,然后就對當前請求的正文內容使用JsonMediaTypeFormatter類型進行反序列化操作。

我們再看下客戶端使用HttpClient類型進行模擬Post請求,

代碼1-8

            HttpClient httpClient = new HttpClient();            Product product = new Product()            {                ProductID = "003",                ProductName = "旺仔牛奶",                ProductCategory = "食品類"            };            await httpClient.PostAsJsonAsync<Product>("http://localhost/selfhost/api/product", product);

最后結果如圖1.

圖1

看到這里想必大家也知道對于XmlMediaTypeFormatter的使用方式是怎樣的了。

還有一種MediaTypeFormatter類型FormUrlEncodedMediaTypeFormatter類型,FormUrlEncodedMediaTypeFormatter類型表示的是在Http Post請求中表單提交的數據所用格式器,我們看一下FormUrlEncodedMediaTypeFormatter類型中CanReadType()方法的實現。

代碼1-9


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久韩剧网电视剧| 欧美久久精品一级黑人c片| 精品动漫一区二区三区| 国产精品96久久久久久又黄又硬| 国模精品视频一区二区三区| 美日韩丰满少妇在线观看| 97精品国产91久久久久久| 欧美天堂在线观看| 日韩视频中文字幕| 狠狠躁夜夜躁人人爽超碰91| 中文字幕视频在线免费欧美日韩综合在线看| 国产精品久久网| 日韩中文字幕精品| 亚洲国产精品成人va在线观看| 久久国产精品亚洲| 亚洲欧美日韩综合| 欧美洲成人男女午夜视频| 久久成人亚洲精品| 亚洲全黄一级网站| 久久九九亚洲综合| 久久久久国产视频| 精品女厕一区二区三区| 国产欧美一区二区三区久久| 精品一区二区亚洲| 亚洲精品国产综合久久| 91精品国产色综合| 69视频在线播放| 欧美日韩一区二区三区在线免费观看| 精品欧美一区二区三区| 中日韩午夜理伦电影免费| 欧美视频二区36p| 日韩免费中文字幕| 国色天香2019中文字幕在线观看| 国产精品视频免费在线| 午夜免费在线观看精品视频| 国产精品电影网| 欧美在线播放视频| 色偷偷偷综合中文字幕;dd| 亚洲精品在线看| 日韩免费在线视频| 日韩高清中文字幕| 日韩网站免费观看高清| 亚洲va欧美va在线观看| 亚洲精品国精品久久99热一| 韩国美女主播一区| 国产精品www| 狠狠做深爱婷婷久久综合一区| 91在线色戒在线| 国产91成人在在线播放| 亚洲最大av网| 曰本色欧美视频在线| 欧美国产高跟鞋裸体秀xxxhd| 欧美日韩成人免费| 日韩美女在线观看| 日韩av免费在线播放| 亚洲a级在线播放观看| 成人在线视频网| 91精品国产高清久久久久久久久| 热久久这里只有精品| 97久久久免费福利网址| 美女少妇精品视频| 在线观看久久av| 91精品久久久久久久久久| 精品自拍视频在线观看| 一区二区中文字幕| 日韩中文字幕免费看| 最近中文字幕2019免费| 亚洲第一天堂无码专区| 亚洲乱码国产乱码精品精| 日韩日本欧美亚洲| 欧美精品videossex88| 国产+人+亚洲| 狠狠躁天天躁日日躁欧美| 欧美成人午夜免费视在线看片| 日韩精品免费综合视频在线播放| 日韩精品视频在线观看免费| www.欧美免费| 国产精品白嫩美女在线观看| 欧美丝袜第一区| 精品女同一区二区三区在线播放| 日韩精品在线第一页| 亚洲片国产一区一级在线观看| 日韩欧美在线观看| 亚洲福利在线看| 91视频国产高清| 性欧美长视频免费观看不卡| 欧美极品在线视频| y97精品国产97久久久久久| 欧美一二三视频| 亚洲精品欧美日韩| 国产精品黄色影片导航在线观看| 伊人亚洲福利一区二区三区| 欧美大片第1页| 欧美成人国产va精品日本一级| 久久精品99无色码中文字幕| 欧美性猛交xxxxx免费看| 欧美激情一二三| 久久国产视频网站| 国产精品久久久久久av下载红粉| 日韩av中文在线| 国产精品三级久久久久久电影| 亚洲精品美女在线| 久久99青青精品免费观看| 国产精品第2页| 欧美成年人视频网站| 国产精品久久久久久久久久久新郎| 亚洲激情在线观看视频免费| 国产香蕉一区二区三区在线视频| 欧美电影免费观看电视剧大全| 日本高清视频一区| 日韩在线观看成人| 欧洲日本亚洲国产区| 国产亚洲美女精品久久久| 欧美视频专区一二在线观看| 国产成人综合av| 亚洲精品国产综合久久| 91亚洲精品视频| 欧美黄色片免费观看| 国产成人精品优优av| 精品女厕一区二区三区| 欧美贵妇videos办公室| 亚洲毛片在线观看| 欧美日韩福利在线观看| 国产精品中文久久久久久久| 欧美日韩亚洲一区二区三区| 亚洲精品电影网站| 日本精品在线视频| 亚洲乱码一区av黑人高潮| 国产精品成人一区二区| 国产精品久久久久久久久久| 欧美一区二区影院| 欧美成人免费播放| 欧美高清理论片| 中文字幕日韩免费视频| 精品国产老师黑色丝袜高跟鞋| 亚洲国产欧美一区二区三区同亚洲| 日本精品久久中文字幕佐佐木| 欧美肥老太性生活视频| 久久久久久久香蕉网| 综合网日日天干夜夜久久| 亚洲精品美女久久久久| 国产精品丝袜久久久久久高清| 国产欧美日韩最新| 51色欧美片视频在线观看| 91久久国产婷婷一区二区| 九九热这里只有精品免费看| 亚洲成人激情小说| 久久久精品2019中文字幕神马| 久久综合伊人77777| 亚洲黄色av女优在线观看| 免费成人高清视频| 国产精品高清免费在线观看| 成人欧美一区二区三区黑人| 日韩有码片在线观看| 一本色道久久88亚洲综合88| 亚洲欧美日韩久久久久久| 久久视频中文字幕| 亚洲欧美综合精品久久成人| 久久中文字幕国产| 欧美日韩国产专区| 高跟丝袜一区二区三区| 国产精品久久久久久亚洲调教| 91精品国产91久久久久福利| 91在线视频一区|