對于我這個初學者來說ASP.NET Web API這個框架很陌生又熟悉著。
陌生的是ASP.NET Web API是一個全新的框架,對于這個框架在一個項目中起到的作用我暫且還不是很清楚這里也就不妄下結論了,說實話不是我不想而是我無能為力,只能自己去摸索試著去了解它。
熟悉的是ASP.NET Web API跟ASP.NET MVC的框架結構一開始看起來有一些相似的地方。
話就不多說了,大家就和我一起來學習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宿主環境
然后我們接著創建一個空的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/selfho
新聞熱點
疑難解答