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

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

MVC4 WebAPI(二)——Web API工作方式

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

MVC4 WebAPI(二)——Web API工作方式

在上篇文章中和大家一起學習了建立基本的WebAPI應用,立刻就有人想到了一些問題:1.客戶端和WebService之間文件傳輸2.客戶端或者服務端的安全控制要解決這些問題,要了解一下WebAPI的基本工作方式。

(一)WebAPI中工作的Class

在MVC中大家都知道,獲取Request和Response使用HttPRequest和HttpResponse兩個類,在WebAPI中使用兩外兩個類:HttpRequestMessage 和HttpResponseMessage,分別用于封裝Requset和Response。除了這兩個類之外,還有一個常見的抽象 類:HttpMessageHandler,用于過濾和加工HttpRequestMessage和HttpResponseMessage

(二)解決第一個問題

其 實第一個問題之所以被提出來應該是和客戶端有關,如果客戶端的請求是我們手寫提交的,比如使用HttpClient封裝的請求,則要傳遞文件之前,我們一 般會進行一次序列化,轉化為二進制數組之類的,在網絡上傳輸。這樣的話,在Controller中的Action參數里,我們只需要接收這個二進制數組類 型的對象就可以了。但是如果客戶端是Web Form呢,比如我們提交一個Form到指定的Controller的Action中,這個Action要接收什么類型的參數呢?或者我們問另外一個問題,如果我將Web Form提交到一個WebAPI的Action中 ,我要怎么去取出這個表單中的數據呢?其 實我們應該想到:我們的Action設置的參數之所以能夠被賦值,是因為WebAPI的架構中在調用Action時將HTTP請求中的數據解析出來分別賦 值給Action中的參數,如果真是這樣的話,我們只需要在Action中獲取到HTTP請求,然后直接獲取請求里面的數據,就能解決上面的問題。這 種想法是正確的,只不過,此時的HTTP請求已經不是最原始的HTTP Request,而是已經被轉化成了HttpRequestMessage,在Action中,我們可以直接調用base.Requet來得到這個 HttpRequestMessage實例,通過這個實例我們就可以隨心所欲的取出HTTP請求中想要的數據。

2.1從RequestMessage中獲取普通表單數據

這里的普通表單是指不包含File的表單,也就是說表單的enctype值不是multipart/form-data,這時,表單的數據默認情況下是以Json來傳遞的如下頁面

復制代碼
<form name="form" action="~/api/FormSubmit?key=11234" method="post">    <input type="text" name="key" id="txtKey" />    <br />    <input type="text" name="value" id="txtValue" />    <br />        <input type="submit" id="btnSubmit" value="Submit" />     </form>
復制代碼

捕獲到的請求為

提交到對應的Action為:

復制代碼
        [HttpPost]        public async void submitForm()        {            StringBuilder sb = new StringBuilder();            HttpContent content = Request.Content;            JsonObject jsonValue = await content.ReadAsOrDefaultAsync<JsonObject>();            foreach (var x in jsonValue)            {                sb.Append(x.Key);                string va ;                if (x.Value.TryReadAs<string>(out va))                {                    sb.Append(va);                }            }        }
復制代碼

這樣最后可以得到 Json的值:{"key":"123","value":"123"} sb處理后的值為:key123value123

注:在該action中使用到了關鍵字async和await,這些在4.5中新提出的關鍵字主要是用于進行多線程取值的,在MVCAPI的設計中,大部分的方法都被設計成類似于下面的方法

public static Task<T> ReadAsOrDefaultAsync<T>(this HttpContent content);

返 回值是一個Task,這種返回新線程的方法雖然可以提高系統的響應能力,但是多線程取值會給編碼帶來不便,所以新出的關鍵字await用于阻塞當前線程并 獲取目標線程的返回值,在方法體中使用await關鍵字后要求將方法聲明為async用來表示該方法是異步的,并且返回值必須為void或者將返回者封裝 在一個Task中當然,如果你不喜歡這種寫法,上面的action也可以寫為:

            Task readTask = content.ReadAsOrDefaultAsync<JsonObject>().ContinueWith((task) => { jsonValue = task.Result; });            readTask.Wait();

2.2從RequestMessage中獲取multipart表單數據將view頁面改寫為

復制代碼
<form name="form" action="~/api/FormSubmit?key=11234" method="post" enctype="multipart/form-data" >    <input type="text" name="key" id="txtKey" />    <br />    <input type="text" name="value" id="txtValue" />    <br />    <input type="file" name="file" id="upFile" />    <br />    <input type="submit" id="btnSubmit" value="Submit" /></form>
復制代碼

此時捕獲到得請求是

這里的文件內容被捕獲軟件解析成字符串,當然如果我上傳的是其他的非文本格式的文件,文件會被轉化為二進制數組這時如果我們不更改action,而直接調用,會發生錯誤,原因很明顯,這個HTTP的報文內容是無法被轉換為JSON的,這時我們需要將表單的報文解析成另外一種格式

復制代碼
                IEnumerable<HttpContent> bodyparts = await content.ReadAsMultipartAsync();                foreach (var bodypart in bodyparts)                {                    string name;                    name = bodypart.Headers.ContentDisposition.Name;                    sb.Append(name + ":");                    if (bodypart.Headers.Contains("filename"))                    {                        Stream stream = await bodypart.ReadAsStreamAsync();                        StreamReader reader = new StreamReader(stream);                        sb.Append(reader.ReadToEnd());                        sb.Append("----");                    }                    else                    {                        string val = await bodypart.ReadAsStringAsync();                        sb.Append(val);                        sb.Append("----");                    }                }
復制代碼

得到的處理后的sb值為:

{"key":123----"value":123----"file":******{文件的內容}*****----}整合后的Action為

復制代碼
        [HttpPost]        public async void submitForm()        {            StringBuilder sb = new StringBuilder();            HttpContent content = Request.Content;            if (content.IsMimeMultipartContent())            {                IEnumerable<HttpContent> bodyparts = await content.ReadAsMultipartAsync();                foreach (var bodypart in bodyparts)                {                    string name;                    name = bodypart.Headers.ContentDisposition.Name;                    sb.Append(name + ":");                    if (bodypart.Headers.Contains("filename"))                    {                        Stream stream = await bodypart.ReadAsStreamAsync();                        StreamReader reader = new StreamReader(stream);                        sb.Append(reader.ReadToEnd());                        sb.Append("----");                    }                    else                    {                        string val = await bodypart.ReadAsStringAsync();                        sb.Append(val);                        sb.Append("----");                    }                }            }            else            {                JsonObject jsonValue = await content.ReadAsOrDefaultAsync<JsonObject>();                foreach (var x in jsonValue)                {                    sb.Append(x.Key);                    string va;                    if (x.Value.TryReadAs<string>(out va))                    {                        sb.Append(va);                    }                }            }        }
復制代碼

(三)WebAPI工作方式

要想解決第二個問題就沒這么容易了,我們需要更深入的理解WebAPI的工作方式。其實對于WebAPI來說,它最初被設計為和WCF一樣的:客戶端、服務端兩套結構,我們到現在之所以還沒有提到客戶端,是因為我們的請求別的方式來封裝成HTTP請求或接收HTTP相應的,比如Ajax和Form表單提交。在這里先給出一個服務端的響應工作流,讓大家有個大體上的認識aspDfAAAAAAAAcgPyGwAAAAAAQG5AfgMAAAAAAMgNyG8AAAAAAAC5AfkNAAAAAAAgNyC/AQAAAAAA5AbkNwAAAAAAgNyA/AYAAAAAAJAbkN8AAAAAAAByA/IbAAAAAABAbsij/BZJTOZGAAAAAAAA9iAv8lskEgmHw+FwOBQKBewz/tlepgL2mWAwGAqFwuFw8gzGPMu0EAqFAgvD241srDAtMI3I+boAAAAAACCvqDy/xUOX32XzNX5AXXned/U7/js/YMp39TveM1+nao4HHPPxFCdsIRKJhEKhYDBIDT+k7v7Ie+brvlsvxRuhLj5F3TxENf/B77IlagQAAAAAACB9qs1v8dwVoLa8ncW+q98N6i9GLJ30qplTtrFgdzF1+Tmq4ZTf6w6FQuwTcUz8CwaD1GgtdeX5QNXb4dGHtG2M10jY1BRsP0tdec7bcSFAbfEaAQAAAAAAkES257f4hYtCSTjspHf5PJve8p8Hmz6ILAzSq6YkFdRfpO78kFpfCgaDTOPRE3d+P9XwW3/lWxGLPnkLtG000Hzad+271OpsvBGZNxcAAAAAAKhYluY39vfNgj6P39xCNf/Bd/dH1N0f+e7+iNL+wW9uCWw5Rb+6tn3SbGPNd/vl0HDZDrkrVuGJGt/tI9750UAgEAwGmRa8d34Y1GtSbIFeNUUs+ngjiHAAAAAAACChbMxv22fPFsepsje8Z77uL3sj2H4mPFrJVLD9jL/sDercP1N3f+RbHI+f7IqnvmAw6HW7fLdfDhsb6BVj6hWZ0fluHtxanvZ6vZ5Np+/2y+HRyl21QK8YI9Ye/91XPXMjiHAAAAAAAGzaPhepcJG+AGtaSNPsIhWuoiXFepVDsiu/bV+1uDbnrXjL

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品美女久久久| 国产mv久久久| 欧美日韩国产综合视频在线观看中文| 97国产精品人人爽人人做| 日韩精品极品在线观看播放免费视频| 国产精自产拍久久久久久| 欧美高清第一页| 国产69久久精品成人看| 欧美成aaa人片在线观看蜜臀| 日韩av一区在线观看| 欧美日韩国产精品专区| 欧美成人剧情片在线观看| 欧美成aaa人片在线观看蜜臀| 日韩免费观看网站| 欧美性极品xxxx娇小| 久热爱精品视频线路一| 国内精品在线一区| 这里只有精品视频在线| 97人人做人人爱| 中文字幕日韩有码| 成人女保姆的销魂服务| 精品中文字幕在线观看| 久久99久久亚洲国产| 亚洲一区二区三区在线视频| 成人黄色av免费在线观看| 国产精品爽爽爽爽爽爽在线观看| 亚洲精品视频免费在线观看| 国产成人午夜视频网址| 国产欧美日韩专区发布| 亚洲激情视频在线| 91精品国产乱码久久久久久蜜臀| 久久精品一偷一偷国产| 亚洲四色影视在线观看| 国产精品户外野外| 欧美精品日韩三级| 欧美中文字幕在线视频| 久久久国产一区| 国产精品久久久久一区二区| 亚洲欧美一区二区激情| 亚洲无av在线中文字幕| 成人黄色免费在线观看| 91亚洲国产成人久久精品网站| 久久伊人色综合| 久久伊人91精品综合网站| 4p变态网欧美系列| 另类少妇人与禽zozz0性伦| 81精品国产乱码久久久久久| 亚洲色图国产精品| 少妇激情综合网| 精品国偷自产在线| 国产免费成人av| 一区二区亚洲欧洲国产日韩| 久久久999成人| 最近中文字幕日韩精品| 欧美日韩一区二区精品| 欧美精品在线观看| 日韩理论片久久| 欧美激情视频在线| 97国产精品久久| 欧美一级黄色网| 国产精品久久久久久久久粉嫩av| 欧美成年人视频网站| 亚洲国产成人在线视频| 欧美日韩中文字幕| 日韩午夜在线视频| 亚洲tv在线观看| 久久久亚洲国产天美传媒修理工| 国产视频在线观看一区二区| 日韩欧美在线字幕| 国产黑人绿帽在线第一区| 亚洲电影免费观看高清完整版在线观看| 亚洲国产毛片完整版| 日韩美女中文字幕| 另类少妇人与禽zozz0性伦| 久久精品亚洲热| 日本在线观看天堂男亚洲| www.亚洲一区| 久久精品国产亚洲精品| 亚洲国内精品在线| 亚洲视频欧美视频| 日韩精品极品在线观看| 668精品在线视频| 亚洲一区二区久久| 久久色精品视频| 日韩男女性生活视频| 欧美午夜视频在线观看| 欧美又大粗又爽又黄大片视频| 亚洲图片欧美日产| 国产欧美日韩免费看aⅴ视频| 国产精品老女人视频| 亚洲网在线观看| 欧美多人乱p欧美4p久久| 91精品国产综合久久香蕉| 91精品久久久久久久久中文字幕| 91av免费观看91av精品在线| 青草青草久热精品视频在线观看| 青青草国产精品一区二区| 美日韩精品免费视频| 成人妇女淫片aaaa视频| 91九色精品视频| 国产精品中文久久久久久久| 欧美乱妇高清无乱码| 91精品综合久久久久久五月天| 国产精品福利观看| 亚洲欧洲激情在线| 日韩av在线网站| 久久精品国产一区二区三区| 亚洲高清一二三区| 疯狂欧美牲乱大交777| 韩国19禁主播vip福利视频| 国产成人小视频在线观看| 97在线精品视频| 国产欧美精品一区二区三区介绍| 91影视免费在线观看| 中文字幕欧美视频在线| 性夜试看影院91社区| 欧美午夜www高清视频| 欧美成人精品三级在线观看| 久久在精品线影院精品国产| 久久免费成人精品视频| 欧美电影第一页| 久久电影一区二区| 精品毛片三在线观看| 日韩网站免费观看高清| 国产69精品久久久久久| 日韩中文字幕在线观看| 国产日韩在线看片| 精品动漫一区二区| 欧美综合在线观看| 一本一本久久a久久精品综合小说| 久久久久久噜噜噜久久久精品| 亚洲欧美一区二区精品久久久| 日韩欧美在线视频观看| 欧美日韩亚洲网| 日本亚洲欧美三级| 色噜噜狠狠狠综合曰曰曰88av| 国产日产欧美精品| 欧美裸身视频免费观看| 日韩精品极品在线观看播放免费视频| 91干在线观看| 宅男66日本亚洲欧美视频| 久久精品亚洲精品| 国产精品国产亚洲伊人久久| 国内精品久久久久影院优| 亚洲国产女人aaa毛片在线| 国产91色在线|免| 91精品国产自产在线老师啪| 国产精品r级在线| 成人在线观看视频网站| 中文字幕日韩高清| 中文字幕精品一区二区精品| 国产欧美一区二区三区四区| 中文字幕亚洲一区在线观看| 日韩69视频在线观看| 欧美激情性做爰免费视频| 这里只有视频精品| 97在线观看视频国产| 久热99视频在线观看| 久久亚洲精品国产亚洲老地址| 国产精品h在线观看| 国产精品自在线| 91免费视频网站| 久久精品国产2020观看福利| 久久精品国产亚洲精品|