對于我這個初學者來說ASP.NET Web API這個架構很陌生又熟悉着。
陌生的是ASP.NET Web API是一個全新的架構,對于這個架構在一個項目中起到的作用我暫且還不是很清楚這裡也就不妄下結論了,說實話不是我不想而是我無能為力,隻能自己去摸索試着去了解它。
熟悉的是ASP.NET Web API跟ASP.NET MVC的架構結構一開始看起來有一些相似的地方。
話就不多說了,大家就和我一起來學習ASP.NET Web API這個全新的架構吧。
環境基礎配置
首先我們建立一個類庫項目命名為Common,并且定義個貨品資訊類型,示例代碼如下:
代碼1-1
1
2
3
4
5
6
7
8
9
<code>namespaceCommon</code>
<code>{</code>
<code> </code><code>publicclassProduct</code>
<code> </code><code>{</code>
<code> </code><code>publicstringProductID { </code><code>get</code><code>; </code><code>set</code><code>; }</code>
<code> </code><code>publicstringProductName { </code><code>get</code><code>; </code><code>set</code><code>; }</code>
<code> </code><code>publicstringProductCategory { </code><code>get</code><code>; </code><code>set</code><code>; }</code>
<code> </code><code>}</code>
<code>}</code>
建立WebHost宿主環境
然後我們接着建立一個空的ASP.NET WEB應用程式命名為WebHost,這裡說明一下ASP.NET Web API架構隻是個獨立架構,它并不能獨立運作,是以它需要宿主環境,剛剛我們建立的WEB應用程式則會在下面的示例中暫時的承載着ASP.NET Web API架構來運作。
引用程式集
Newtonsoft.Json.dll 路徑: C:\Program Files\Microsoft ASP.NET\ASP.NET MVC 4\Packages\Newtonsoft.Json.4.5.6\lib\net40Newtonsoft.Json.dll
System.Net.Http.dll 路徑:C:\Program Files\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies\ System.Net.Http.dll
System.Net.Http.Formatting.dll路徑:C:\Program Files\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies\ System.Net.Http.Formatting.dll
System.Web.Http.dll 路徑:C:\Program Files\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies\ System.Web.Http.dll
System.Web.Http.WebHost.dll路徑:C:\Program Files\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies\System.Web.Http.WebHost.dll
Common.dll (項目引用)
或者采用這種引用方式:
(如果上文中所述的目錄位置沒有Newtonsoft.Json.dll的話可以檔案搜尋一下,然後手動引用。)
随之我們再建立一個Web應用程式處理類Globl.asax ,并在其Application_Start()方法中注冊路由,示例代碼如下:
代碼1-2
10
11
12
13
<code>usingSystem.Web.Http;</code>
<code> </code>
<code>namespaceWebHost</code>
<code> </code><code>publicclassGlobal : System.Web.HttpApplication</code>
<code> </code><code>protectedvoidApplication_Start(objectsender, EventArgse)</code>
<code> </code><code>{</code>
<code> </code><code>GlobalConfiguration.Configuration.Routes.MapHttpRoute(</code>
<code> </code><code>"DefaultAPI"</code><code>, </code><code>"api/{controller}/{id}"</code><code>, </code><code>new</code> <code>{ controller=</code><code>"product"</code><code>,id=RouteParameter.Optional });</code>
<code> </code><code>}</code>
路由注冊好了之後,我們還得建立個Web API控制器,命名為ProductController,示例代碼如下:
代碼1-3
14
15
16
17
18
19
20
21
22
23
24
25
26
<code>usingCommon;</code>
<code>namespaceWebHost.Controllers</code>
<code> </code><code>publicclassProductController:ApiController</code>
<code> </code><code>privatestaticList<Product>products;</code>
<code> </code><code>staticProductController()</code>
<code> </code><code>products=newList<Product>();</code>
<code> </code><code>products.AddRange(</code>
<code> </code><code>newProduct[] </code>
<code> </code><code>{</code>
<code> </code><code>newProduct(){ ProductID=</code><code>"001"</code><code>, ProductName=</code><code>"牙刷"</code><code>,ProductCategory=</code><code>"洗漱用品"</code><code>},</code>
<code> </code><code>newProduct(){ ProductID=</code><code>"002"</code><code>, ProductName=</code><code>"《.NET架構設計—大型企業級應用架構設計藝術》"</code><code>, ProductCategory=</code><code>"書籍"</code><code>}</code>
<code> </code><code>});</code>
<code> </code><code>publicIEnumerable<Product>Get(stringid=</code><code>null</code><code>)</code>
<code> </code><code>returnfromproductinproductswhereproduct.ProductID==id||</code><code>string</code><code>.IsNullOrEmpty(id) selectproduct;</code>
在代碼1-3中我們看到ProductController控制器繼承自ApiController,這裡的方式我的猜想應該是跟ASP.NET MVC架構對控制器的處理一樣,在請求到來之後并且經過路由處理之後,Web API架構會把目前項目中所有引用的程式集全部查找一下并且搜出繼承自ApiController的類型,并且緩存在一個xml檔案,不知道猜想的對不對在後面的篇幅我們再來驗證,這裡提一下。
細心的朋友的可能發現在路由注冊的時候并沒有對應的Action的路由參數,其實這裡就是Web API架構的一個不同之處,它是根據Http請求方法來确定Action的方法的,然而浏覽器預設的請求方法就是Http-get,是以我們這個時候可以直接運作項目。
圖2
建立SelfHost
下面我們來看一下在SelfHost宿主環境中ASP.NET Web API架構的使用示例。
首先我們建立一個控制台應用程式命名為SelfHost,SelfHost環境項目的程式集引用和上面所說的WebHost項目引用唯一不同的就是把System.Web.Http.WebHost.dll程式集換成System.Web.Http.SelfHost.dll程式集,引用路徑不變,也可以利用引用裡的擴充欄來添加。
下面就讓我們看一下在SelfHost中我們需要做哪些事,首先我們需要注冊路由這是每次最先做的事情,示例代碼如下:
代碼1-4
<code>usingSystem.Web.Http.SelfHost;</code>
<code>namespaceSelfHost</code>
<code> </code><code>classProgram</code>
<code> </code><code>staticvoidMain(</code><code>string</code><code>[] args)</code>
<code> </code><code>HttpSelfHostConfigurationselfHostConfiguration=</code>
<code> </code><code>newHttpSelfHostConfiguration(</code><code>"http://localhost/selfhost"</code><code>);</code>
<code> </code><code>using</code> <code>(HttpSelfHostServerselfHostServer=newHttpSelfHostServer(selfHostConfiguration))</code>
<code> </code><code>{</code>
<code> </code><code>selfHostServer.Configuration.Routes.MapHttpRoute(</code>
<code> </code><code>"DefaultApi"</code><code>, </code><code>"api/{controller}/{id}"</code><code>, </code><code>new</code> <code>{ id=RouteParameter.Optional});</code>
<code> </code><code>selfHostServer.OpenAsync();</code>
<code> </code><code>Console.WriteLine(</code><code>"伺服器端服務監聽已開啟"</code><code>);</code>
<code> </code><code>Console.Read();</code>
<code> </code><code>}</code>
這裡就簡要的說明一下,在1-4代碼中HttpSelfHostConfiguration對象示例中設定了基位址,對于HttpSelfHostConfiguration類型它是繼承自HttpConfiguration類型,HttpConfiguration類型是比較重要的一個類型,WebAPI架構中大多數的配置資訊都在此類型執行個體中進行設定。在後續的篇幅中會有說到。
HttpSelfHostServer對象就是在SelfHost宿主環境中擔當着很重要的角色,它負責處理請求等一系列操作(因為它是WebAPI架構在SelfHost環境中的管道模型的&ldquo;龍頭&rdquo;),在這裡隻要稍作了解就行了,會在後面的管道篇幅揭開它的神秘面紗。
繼續向下看我們會看到HttpSelfHostServer對象執行個體中的Configuration屬性裡的Routes屬性提供了對路由的注冊,這部分内容會在後面的路由篇幅講解。
再之後就是我們看到的,打開服務監聽,等待處理請求。(這裡的監聽/處理請求,并不是對真正的請求進行處理,而是對已經請求被封裝好了的對象進行處理,管道篇幅中講解)
在路由注冊之後我們要建立個Web API控制器,就如同上面WebHost部分内容一樣,拷貝一份過來,不過我們這裡要對控制器的代碼稍作修改,示例代碼如下:
代碼1-5
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<code>namespaceSelfHost.Controllers</code>
<code> </code><code>publicvoidDelete(stringid)</code>
<code> </code><code>products.Remove(products.First(product=>product.ProductID==id));</code>
<code> </code><code>publicvoidPost(Productproduct)</code>
<code> </code><code>products.Add(product);</code>
<code> </code><code>publicvoidPut(Productproduct)</code>
<code> </code><code>Delete(product.ProductID);</code>
<code> </code><code>Post(product);</code>
對于在代碼1-5中控制器新增的幾個Action方法,也是分别對應着Http請求方法。這樣也就是能實作增删改查的基礎功能了。那我們還需要一個對它進行通路的用戶端。
建立Clinet
我們再建一個控制台應用程式命名為Clinet,并且添加如下程式集引用:
下面我們看一下在Client項目中對SelfHost環境中的資源進行通路的示例,示例代碼如下:
代碼1-6
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<code>usingSystem.Net.Http;</code>
<code>namespaceClient</code>
<code> </code><code>AsyncProcess();</code>
<code> </code><code>Console.Read();</code>
<code> </code><code>privateasyncstaticvoidAsyncProcess()</code>
<code> </code><code>HttpClienthttpClient=newHttpClient();</code>
<code> </code><code>//擷取貨品資訊清單</code>
<code> </code><code>HttpResponseMessageresponseMessage=</code>
<code> </code><code>awaithttpClient.GetAsync(</code><code>"http://localhost/selfhost/api/product"</code><code>);</code>
<code> </code><code>IEnumerable<Product>products=awaitresponseMessage.Content.ReadAsAsync<IEnumerable<Product>>();</code>
<code> </code><code>OutputProductInfo(products);</code>
<code> </code><code>//添加貨品</code>
<code> </code><code>Productproduct=newProduct()</code>
<code> </code><code>ProductID=</code><code>"003"</code><code>,</code>
<code> </code><code>ProductName=</code><code>"《ASP.NET Web API 2 架構揭秘》"</code><code>,</code>
<code> </code><code>ProductCategory=</code><code>"食品類"</code>
<code> </code><code>};</code>
<code> </code><code>awaithttpClient.PostAsJsonAsync<Product>(</code><code>"http://localhost/selfhost/api/product"</code><code>, product);</code>
<code> </code><code>responseMessage=awaithttpClient.GetAsync(</code><code>"http://localhost/selfhost/api/product"</code><code>);</code>
<code> </code><code>products=awaitresponseMessage.Content.ReadAsAsync<IEnumerable<Product>>();</code>
<code> </code><code>//修改指定貨品資訊</code>
<code> </code><code>responseMessage=awaithttpClient.GetAsync(</code><code>"http://localhost/selfhost/api/product/003"</code><code>);</code>
<code> </code><code>product= (awaitresponseMessage.Content.ReadAsAsync<IEnumerable<Product>>()).First();</code>
<code> </code><code>product.ProductCategory=</code><code>"書籍"</code><code>;</code>
<code> </code><code>awaithttpClient.PutAsJsonAsync<Product>(</code><code>"http://localhost/selfhost/api/product"</code><code>, product);</code>
<code> </code><code>//删除指定貨品</code>
<code> </code><code>awaithttpClient.DeleteAsync(</code><code>"http://localhost/selfhost/api/product/001"</code><code>);</code>
<code> </code><code>privatestaticvoidOutputProductInfo(IEnumerable<Product>products)</code>
<code> </code><code>foreach</code> <code>(Productproductinproducts)</code>
<code> </code><code>Console.WriteLine(</code>
<code> </code><code>"ProductID:{0},ProductName:{1},ProductCategorm:{2}"</code><code>,</code>
<code> </code><code>product.ProductID, product.ProductName, product.ProductCategory);</code>
<code> </code><code>Console.WriteLine(</code><code>"—————————————————————————"</code><code>);</code>
對于代碼1-5中出現諸多的類型會在後面的篇幅中一一的講解,這裡就不做闡述了,而是看一下我們最終的示例結果:
首先我們要運作SelfHost項目,等待界面和如下圖3時,再行Client項目對SelfHost中的資源進行通路。結果如圖4
圖3
圖4
就是仿照蔣大書籍中的示例簡化了一下做了一點調整,因為後面的篇幅中有用到這個示例。
這裡吐槽一下起初國内對于Web API的書籍資料幾乎沒有,當然國外的有是有,不過都是英文版的。對于毫無英語基礎的我等于是判了死緩,唯一的活路就是用翻譯工具一點點的去看。
還好蔣大的新作出來了,不然想學Web API還真是無路可走。已看完前三章,收獲頗多知識點很全面,在後面我學習到一些都會寫出來跟大家分享。
本文轉自jinyuan0829 51CTO部落格,原文連結:http://blog.51cto.com/jinyuan/1534367,如需轉載請自行聯系原作者