剛開始表面上感覺Web API内容似乎沒什麼,也就是傳回JSON資料,事實上遠非我所想,不去研究不知道,其中的水還是比較深,那又如何,一步一個腳印來學習都将迎刃而解。

以上就是關于Web API關于主機的設定,接下來就是建立一個用戶端來通路此伺服器上的資源。
GetAsync和ReadAsync為異步方法,直到獲得結果值即Result屬性的值操作完成,否則将一直阻塞線程。
接下來就是啟動Web API伺服器程式,通過Web API用戶端來通路伺服器并獲得其請求的資源。【注意】windows 8系統啟動伺服器必須以管理者身份運作,否則報錯。
通路資源成功,如下:
如果對MVC架構中路由熟悉的話,Web API的路由原理和其相似,但是不同的是Web API是使用的HTTP方法來選擇Action方法而不是通過URI路徑來選擇Action方法。
當我們需要将Web API作為伺服器時此時必須直接在HttpSelfHostConfiguration上設定路由表【上述關于SelfHost已經示範】
在Web API路由配置檔案中有一個 Register 方法,該方法中有一個 HttpConfiguration 執行個體參數,該HttpConfiguration是消息管道中的全局對象,我們可以通過其對管道某一個行為作出相關操作,進而達到我們所需。通過HttpConfiguration上的屬性_routes即 HttpRouteCollection 對象中的 CreateRoute 方法再依據預設的路由模闆、預設值以及相關限制來建立實作了 IHttpRoute 接口的路由對象即 HttpRoute ,并通過HttpConfiguration中的Routes對象中的擴充方法MapHttpRoute方法來達到注冊路由映射的目的,當然我們也可以直接通過調用路由集合HttpRouteCollection中的 Add 方法來注冊路由到路由表中。
例如,用下面的URI來比對預設的路由
【注意】為何在Web API的控制器中以API開頭的原因是避免和MVC架構中的路由沖突,如/contacts會進入到MVC路由中,而/api/contacts會進入到Web API架構中,當然我們可以通過改變預設的路由表來改變約定,但是不建議這麼做。
一旦一個比對的路由被找到,Web API根據預設約定來選擇Controller和Action:
當一個URI資源請求過來時Web API架構會查找已經注冊的路由表中的路由并進行比對,如果比對通過,此時将建立一個包含每個占位符的值的字典,字典的鍵為占位符的名稱,當然不包括大括号,字典的值為請求過來的URI中的值或者是路由模闆中的預設值,然後這個字典将會儲存在 IHttpRouteData 對象中的字典中。該對象還存在一個路由對象IHttpRoute。當請求的URI過來時,此時會通過請求資訊即 HttpRequestMessage 對象中的 RquestUri 屬性來獲得其URI,接下來HttpRoute會接受到HttpRequestMessage中的URI并進行解析,然後将通過調用 GetRouteData 等方法來封裝路由資料給實作了IHttpRouteData接口的 HttpRouteData ,通過HttpRouteData中的構造函數中的路由對象來擷取傳遞過來的路由對象HttpRoute(該路由對象也根據請求過來的路由變量來綁定到路由模闆中最終生成一個完整的URL),同時因為實作了IHttpRouteData接口則此時該接口的字典将傳遞給HttpRouteData構造函數中的路由字典即 HttpRouteValueDictionary 。【注意】GetRouteData方法中的參數有一個為virtualPathRoot即虛拟根路徑,當執行此方法時得到的是相對路徑,也就是說通過路由模闆進行比對是根據相對路徑來進行比對的。
查找控制器是通過 IHttpControllerSelector 接口上的 SelectController ,此方法參數為HttpRequestMessage的執行個體并傳回一個 HttpControllerDescriptor ,此接口的預設實作是通過 DefaultHttpControllerSelector 類實作,此類實作的算法有如下三點:
在查找到控制器之後,架構将會通過 IHttpActionSelector 接口中的 SelectAction 方法來查找Action方法,該方法參數要擷取一個控制器上下文即 HttpControllerContext 傳回一個 HttpActionDescriptor 對象執行個體。其預設實作是通過 APiControllerActionSelector 來提供的,要查找到Action要經過如下三點:
【注意】如何确定在控制上的方法是Action方法呢?當查找Action方法時,僅僅隻着眼于控制上的公有的執行個體方法(不包括從APiController上繼承的特殊名稱的方法,如:重載、事件、構造等等)并且是從APiController類上繼承的方法。
綜上所述,對于Web API上的一個路由系統總共有三個階段
當然你可以對路由模闆進行自定義以及相關參數利用正規表達式進行限制等,這就不再較長的描述。
接下來我們就上述叙述來進行相關例子
對于以下可能的HTTP請求,會對于每個請求對應應該被調用的Action方法。
HTTP Method
URI PATH
Action
Parameter
GET
api/products
GetAllProducts
(none)
api/products/4
GetProductById
4
DELETE
DeleteProduct
POST
(no match)
【注意】在上述中的URI的{id},如果存在則會被映射到Action方法中的id參數中,如上述中兩種Get方法,一個有id參數一個沒有沒有id參數。同時也應注意POST請求将會失敗,因為在控制器中沒有定義一個POST....方法。
假設Web API控制器名稱ProductController并繼承APiController,在該控制器下有如下兩個方法:
除了使用約定的HTTP方法之外,我們也可以使用特性HttpGet、HttpPost、HttpPut以及HttpDelete來修飾Action方法來顯式指定一個Action的HTTP方法。
我們可以使用 AcceptVerbs 特性對一個Action使用多個HTTP方法或者說是使用HTTP方法而不是POST、DELETE、GET以及PUT,如下:
由于預設的路由模闆,Web API使用HTTP方法來選擇Action,但是我們可以建立一個包括在URI中的Action名稱的路由。如下:
在上述路由模闆中,{action} 參數名稱命名了在控制器上的Action方法,在此種路由下,可以使用特性來指定HTTP方法,例如,允許控制器有如下方法:
在此種情況下,對于api/products/details的GET請求會映射到Details方法,這種路由風格和MVC相似。