對於我這個初學者來講ASP.NET Web API這個框架很陌生又熟悉着。html
陌生的是ASP.NET Web API是一個全新的框架,對於這個框架在一個項目中起到的做用我暫且還不是很清楚這裏也就不妄下結論了,說實話不是我不想而是我無能爲力,只能本身去摸索試着去了解它。web
熟悉的是ASP.NET Web API跟ASP.NET MVC的框架結構一開始看起來有一些類似的地方。api
話就很少說了,你們就和我一塊兒來學習ASP.NET Web API這個全新的框架吧。瀏覽器
環境基礎配置緩存
首先咱們新建一個類庫項目命名爲Common,而且定義個貨品信息類型,示例代碼以下:服務器
代碼1-1框架
namespace Common { public class Product { public string ProductID { get; set; } public string ProductName { get; set; } public string ProductCategory { get; set; } } }
創建WebHost宿主環境async
而後咱們接着建立一個空的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
using System.Web.Http; namespace WebHost { public class Global : System.Web.HttpApplication { protected void Application_Start(object sender, EventArgs e) { GlobalConfiguration.Configuration.Routes.MapHttpRoute( "DefaultAPI", "api/{controller}/{id}", new { controller="product",id = RouteParameter.Optional }); } } }
路由註冊好了以後,咱們還得新建個Web API控制器,命名爲ProductController,示例代碼以下:
代碼1-3
using System.Web.Http; using Common; namespace WebHost.Controllers { public class ProductController:ApiController { private static List<Product> products; static ProductController() { products = new List<Product>(); products.AddRange( new Product[] { new Product(){ ProductID="001", ProductName="牙刷",ProductCategory="洗漱用品"}, new Product(){ ProductID="002", ProductName="《.NET框架設計—大型企業級應用框架設計藝術》", ProductCategory="書籍"} }); } public IEnumerable<Product> Get(string id = null) { return from product in products where product.ProductID == id || string.IsNullOrEmpty(id) select product; } } }
在代碼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
using System.Web.Http; using System.Web.Http.SelfHost; namespace SelfHost { class Program { static void Main(string[] args) { HttpSelfHostConfiguration selfHostConfiguration = new HttpSelfHostConfiguration("http://localhost/selfhost"); using (HttpSelfHostServer selfHostServer = new HttpSelfHostServer(selfHostConfiguration)) { selfHostServer.Configuration.Routes.MapHttpRoute( "DefaultApi", "api/{controller}/{id}", new { id=RouteParameter.Optional}); selfHostServer.OpenAsync(); Console.WriteLine("服務器端服務監聽已開啓"); Console.Read(); } } } }
這裏就簡要的說明一下,在1-4代碼中HttpSelfHostConfiguration對象示例中設置了基地址,對於HttpSelfHostConfiguration類型它是繼承自HttpConfiguration類型,HttpConfiguration類型是比較重要的一個類型,WebAPI框架中大多數的配置信息都在此類型實例中進行設置。在後續的篇幅中會有說到。
HttpSelfHostServer對象就是在SelfHost宿主環境中擔當着很重要的角色,它負責處理請求等一系列操做(由於它是WebAPI框架在SelfHost環境中的管道模型的「龍頭」),在這裏只要稍做了解就好了,會在後面的管道篇幅揭開它的神祕面紗。
繼續向下看咱們會看到HttpSelfHostServer對象實例中的Configuration屬性裏的Routes屬性提供了對路由的註冊,這部份內容會在後面的路由篇幅講解。
再以後就是咱們看到的,打開服務監聽,等待處理請求。(這裏的監聽/處理請求,並非對真正的請求進行處理,而是對已經請求被封裝好了的對象進行處理,管道篇幅中講解)
在路由註冊以後咱們要新建個Web API控制器,就如同上面WebHost部份內容同樣,拷貝一份過來,不過咱們這裏要對控制器的代碼稍做修改,示例代碼以下:
代碼1-5
using System.Web.Http; using Common; namespace SelfHost.Controllers { public class ProductController:ApiController { private static List<Product> products; static ProductController() { products = new List<Product>(); products.AddRange( new Product[] { new Product(){ ProductID="001", ProductName="牙刷",ProductCategory="洗漱用品"}, new Product(){ ProductID="002", ProductName="《.NET框架設計—大型企業級應用框架設計藝術》", ProductCategory="書籍"} }); } public IEnumerable<Product> Get(string id = null) { return from product in products where product.ProductID == id || string.IsNullOrEmpty(id) select product; } public void Delete(string id) { products.Remove(products.First(product => product.ProductID == id)); } public void Post(Product product) { products.Add(product); } public void Put(Product product) { Delete(product.ProductID); Post(product); } } }
對於在代碼1-5中控制器新增的幾個Action方法,也是分別對應着Http請求方法。這樣也就是能實現增刪改查的基礎功能了。那咱們還須要一個對它進行訪問的客戶端。
創建Clinet
咱們再建一個控制檯應用程序命名爲Clinet,而且添加以下程序集引用:
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
Common.dll (項目引用)
下面咱們看一下在Client項目中對SelfHost環境中的資源進行訪問的示例,示例代碼以下:
代碼1-6
using Common; using System.Net.Http; namespace Client { class Program { static void Main(string[] args) { AsyncProcess(); Console.Read(); } private async static void AsyncProcess() { HttpClient httpClient = new HttpClient(); //獲取貨品信息列表 HttpResponseMessage responseMessage = await httpClient.GetAsync("http://localhost/selfhost/api/product"); IEnumerable<Product> products = await responseMessage.Content.ReadAsAsync<IEnumerable<Product>>(); OutputProductInfo(products); //添加貨品 Product product = new Product() { ProductID = "003", ProductName = "《ASP.NET Web API 2 框架揭祕》", ProductCategory = "食品類" }; await httpClient.PostAsJsonAsync<Product>("http://localhost/selfhost/api/product", product); responseMessage = await httpClient.GetAsync("http://localhost/selfhost/api/product"); products = await responseMessage.Content.ReadAsAsync<IEnumerable<Product>>(); OutputProductInfo(products); //修改指訂貨品信息 responseMessage = await httpClient.GetAsync("http://localhost/selfhost/api/product/003"); product = (await responseMessage.Content.ReadAsAsync<IEnumerable<Product>>()).First(); product.ProductCategory = "書籍"; await httpClient.PutAsJsonAsync<Product>("http://localhost/selfhost/api/product", product); responseMessage = await httpClient.GetAsync("http://localhost/selfhost/api/product"); products = await responseMessage.Content.ReadAsAsync<IEnumerable<Product>>(); OutputProductInfo(products); //刪除指訂貨品 await httpClient.DeleteAsync("http://localhost/selfhost/api/product/001"); responseMessage = await httpClient.GetAsync("http://localhost/selfhost/api/product"); products = await responseMessage.Content.ReadAsAsync<IEnumerable<Product>>(); OutputProductInfo(products); } private static void OutputProductInfo(IEnumerable<Product> products) { foreach (Product product in products) { Console.WriteLine( "ProductID:{0},ProductName:{1},ProductCategorm:{2}", product.ProductID, product.ProductName, product.ProductCategory); } Console.WriteLine("—————————————————————————"); } } }
對於代碼1-5中出現諸多的類型會在後面的篇幅中一一的講解,這裏就不作闡述了,而是看一下咱們最終的示例結果:
首先咱們要運行SelfHost項目,等待界面和以下圖3時,再行Client項目對SelfHost中的資源進行訪問。結果如圖4
圖3
圖4
參考資料: http://www.cnblogs.com/artech/p/web-api-sample.html
就是仿照蔣大書籍中的示例簡化了一下作了一點調整,由於後面的篇幅中有用到這個示例。
這裏吐槽一下起初國內對於Web API的書籍資料幾乎沒有,固然國外的有是有,不過都是英文版的。對於毫無英語基礎的我等因而判了死緩,惟一的活路就是用翻譯工具一點點的去看。
還好蔣大的新做出來了,否則想學Web API還真是無路可走。已看完前三章,收穫頗多知識點很全面,在後面我學習到一些都會寫出來跟你們分享。
做者:金源
出處:http://www.cnblogs.com/jin-yuan/
本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面