接下來進入的是俺在ASP.NET學習中最重要的WebAPI部分,在如今流行的互聯網場景下,WebAPI能夠和HTML五、單頁應用程序SPA等技術和理念很好的結合在一塊兒。所謂ASP.NET WebAPI,其核心概念就是構建REST風格的Web服務,把一塊兒數據視爲資源,不管是服務請求或者是數據操做,與之前的SOAP和XML-RPC架構風格有很大不一樣。說道這,不少讀者可能想到WCF中不是早都有了REST風格的服務麼,爲何還須要這個WebAPI?確實如此,不過WCF中的該類型服務顯得比較複雜,由於其通訊管道的構成因爲集成了多種不一樣的通訊協議,天然的其基礎程序集就顯得很是的龐大臃腫。javascript
簡單來講,WebAPI就是簡單高效,"你值得擁有"!讓咱們經過臨摹蔣老師的例子對它有個初步的瞭解,後端代碼以下:html
前端代碼以下:前端
這個像補充的是,蔣老師在這用的是自帶的knockoutJS做爲MVVM風格的部分前端框架。關於這一塊,有一個問題困擾了我好久,就是KnockoutJS和AngularJS誰的適用性更強,其實它們沒有可比性,KnockoutJS只提供了部分的工做。如下連接是對此問題的解釋,結論是我將學習並使用AngularJS。java
http://blog.darkthread.net/post-2014-06-07-go-to-angularjs.aspxangularjs
說到這,我還想到了學習中的一個困惑,那麼多的IOC框架到底哪一個相對更好一些?結論是Autofac,它以被使用在Orchard開源的CMS系統中,順道提一嘴,nopCommerce的.net開源電商系統也不錯哦。以前IOC框架對比的詳情請見以下連接,李平老師作了最好的解釋:web
http://www.cnblogs.com/liping13599168/archive/2011/07/17/2108734.html編程
接下來,介紹ASP.NET WebAPI的服務器管道,這一塊和以前學習的ASP.NET MVC管道很類似,但也有一些差別,不過我的感受這個管道更加的像J2EE的管道了。因爲不少內容比較類似,將進行簡單的介紹,不過框架中異步編程模型用的不少,值得學習參考。下圖簡單的表述了框架對請求的處理過程:json
框架經過單例提供HttpControllerHandler對象,多個HttpWebRoute共享對象,而且它將建立右側的ASP.NET Web API處理管道,經過調用BeginProcessRequest方法激活管道運轉。該管道其實就是HttpMessgaeHandler鏈,HttpServer和HttpControllerDispatcher能夠看作兩個特殊的HttpMessageHandler,接下來經過表格的形式對相關類型進行簡單的介紹:後端
類型 | 簡介 |
HttpMessageHandler | 核心類,針對請求的處理實如今SendAsync中,針對響應的處理經過返回類型Task<HttpResponseMessage>完成 |
HttpRequestMessage | Content屬性封裝Http主體信息 |
HttpResponseMessage | StatusCode、ReasonPhrase屬性表示響應狀態碼與描述 |
DelegatingHandler | 用於構建處理鏈,經過InnerHanlder屬性進行傳遞,是責任鏈模式的實現? |
HttpServer | Dispatcher屬性指向最終的分發器對象,Configuration屬性包含了全部的配置信息。 |
HttpConfiguration | DependencyResolverFilters: AuthorizationFilter, ActionFilter, ExceptionFilterFormatters:返回格式化器列表IncludeErrorDetailPolicy:客戶端異常顯示策略PropertiesServices: 返回ServiceContainer,一個簡易IocR容器,默認實現爲DefaultServices,很經常使用。 |
HttpControllerHandler以延遲加載的方式來建立HttpServer,字典屬性Properties以Key爲"MS_HttpContext"、"MS_HttpRouteData"的形式傳遞相關數據。HttpControllerDispatcher負責最後對請求作最後的處理,包括對ApiController的激活和目標Action的執行等操做,用下表簡述該過程:api
行爲 | 簡介 |
HttpController的激活 | 藉助HttpControllerDescriptor,完成HttpController類型解析、選擇、建立等操做,能夠經過自定義DependencyResolver或HttpControllerActivator來實現基於IOC的HttpController的激活。 |
HttpController的執行 | 經過ExecuteAsync方法,參數爲HttpControllerContext,注意UrlHelper中Link表明絕對地址,Route相對地址 |
Action的選擇 | HttpActionDescriptor的ExecuteAsync方法實現Action的執行,Action支持7中不一樣的HTTP方法,默認爲POST。經過HttpActionSelector組件實現對目標Action的選擇,方法GetActionMapping的返回值爲一個ILookup<string, HttpActionDescriptor>類型 |
Model元數據的解析 | 與MVC基本一致 |
Action參數綁定 | 藉助HttpParameterDescriptor、HttpActionBinding,經過HttpParameterBinding對象的ExecuteBindingAsync完成綁定,具體的實現類有: CancellationTokenParameterBinding ErrorParameterBinding FomatterParameterBinding:消息主體,html,json,xml HttpRequestParameterBinding:HttpRequestMessage ModelBinderParameterBinding:查詢字符串,路由數據 |
Model的驗證 | 包括DataAnnotationModelValidator RequiredMemberModelValidator ValidatableObjectAdapter ErrorModelValidator等驗證器,須要注意的是該框架中驗證過程是遞歸的,與MVC有點不一樣。 |
Action的執行與結果的響應 | 經過HttpActionInvoker的InvokerActionAsync方法激活Action,經過ActionResultConverter將Action的返回值轉換爲HttpResponseMessage,轉換器包括: ResponseMessageResultConverter ValueResultConverter<T> VoidResultConverter 3個內置Filter篩選器的做用與MVC中的相似 |
補上IOC實現的代碼和HttpParameterBinding的流程圖:
HttpParameterBinding流程圖:
最後介紹與WebAPI客戶端調用相關的內容,提到調用你們第一反應就是在Web頁面中經過javascript進行Ajax調用,獲取數據並呈現,服務的消費者是前端頁面,這只是調用的主要方式之一。另一種就是經過HttpClient來進行調用,這和Web Service調用很類似,服務的消費者是通常應用程序。HttpClient類繼承之抽象類HttpMessageInvoker,核心方法SendAsync包括HttpRequestMessage的參數和HttpResponseMessage的返回類型,和以前服務器端的HttpMessageHandler類型同樣,實際上HttpClient就是一個該類的封裝。HttpCompletionOption用於設置響應完成的標誌,包括讀完消息頭和讀完消息體。屬性BaseAddress用於指定WebAPI基地址,DefaultRequestHeader用於添加任意的報頭,MaxResponseContentBufferSize表示讀取緩存區的大小,默認2G,Timeout表示超時時限,默認100s。GetAsync, GetByteArrayAsync, GetStreamAsync, GetStringAsync用於HTTP-GET請求,其餘方法也有類似定義。下面經過一個服務器端自我寄宿,客戶端通常調用的例子完成學習,須要注意經過Nuget添加SelfHost和Client的庫,代碼以下所示:
此外,WebAPI學習系列目錄以下,歡迎您的閱讀!
快速入門系列--WebAPI--04在老版本MVC4下的調整
注:本文主要供本身學習,不妥之處望見諒。
參考資料:
[1]蔣金楠. ASP.NET MVC4框架揭祕[M]. 上海:電子工業出版社, 2012. 445-526