前言html
閱讀本文以前,您也能夠到Asp.Net Web API 2 系列導航進行查看 http://www.cnblogs.com/aehyok/p/3446289.htmlweb
Asp.Net Web API能夠須要IIS。你能夠在你本身的主機上來承載一個Web API。api
本教程來展現在控制檯應用程序中來承載一個Web API。使用的開發工具爲VS2013。asp.net
本文示例代碼下載連接http://pan.baidu.com/s/1d56zf異步
建立一個控制檯應用程序工具
這裏我默認的Framework版本爲4.5的。而後經過Nuget來下載安裝Microsoft.AspNet.WebApi.SelfHost。開發工具
建立Model和Controller測試
首先添加一個public公共類Product。ui
public class Product { public int Id { get; set; } public string Name { get; set; } public string Category { get; set; } public decimal Price { get; set; } }
而後添加一個public公共類ProductsController,而且這個類繼承自System.Web.Http.ApiController。記得添加擴展引用System.Web.Http。url
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using System.Web.Http; namespace SelfHost { public class ProductsController:ApiController { Product[] products = new Product[] { new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 }, new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M }, new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M } }; public IEnumerable<Product> GetAllProducts() { return products; } public Product GetProductById(int id) { var product = products.FirstOrDefault((p) => p.Id == id); if (product == null) { throw new HttpResponseException(HttpStatusCode.NotFound); } return product; } public IEnumerable<Product> GetProductsByCategory(string category) { return products.Where(p => string.Equals(p.Category, category, StringComparison.OrdinalIgnoreCase)); } } }
這個控制器定義了三個Get方法:
承載Web API
打開Program.cs,而後添加以下使用語句:
using System.Web.Http; using System.Web.Http.SelfHost;
固然若是你沒有引用,仍是先要添加引用的(另外還有System.Net.Http)。而後添加以下代碼到Program.cs裏:
var config = new HttpSelfHostConfiguration("http://localhost:8080"); config.Routes.MapHttpRoute( "API Default", "api/{controller}/{id}", new { id = RouteParameter.Optional }); using (HttpSelfHostServer server = new HttpSelfHostServer(config)) { server.OpenAsync().Wait(); Console.WriteLine("Press Enter to quit."); Console.ReadLine(); }
如今你能夠運行控制檯程序了。
如今能夠經過URI來簡單測試Web API的正確性。
(可選的)添加一個HTTP URL命名空間保留(沒遇到這個問題,暫未測試)
這個應用程序偵聽到"http://localhost:8080"。在默認狀況下,偵聽一個特殊的HTTP URL是須要管理員權限的。當你運行上面的控制檯應用程序的時候,你可能會獲得這樣的一個錯誤:"HTTP could not register URL http://+:8080",這兒有兩種方式去避免這個錯誤:
1.以管理員身份運行Visual Studio。
2.使用Netsh.exe給與你的帳號權限去保留這個URL。
若要使用Netsh.exe,以管理員身份打開命令提示框,並鍵入如下命令:
netsh http add urlacl url=http://+:8080/ user=machine\username
其中machine\username是您的用戶賬戶。
當你使用完自託管的時候,最好是肯定刪除這個保留的URL。
netsh http delete urlacl url=http://+:8080/
經過客戶端應用程序來調用Web API
讓咱們來寫一個簡單的控制檯應用程序來調用Web API。
添加一個控制檯應用程序,並命名爲"ClientApp"。
一樣的經過Nuget來添加Microsoft.AspNet.WebApi.Client。
固然還須要應用SelfHost這個項目。
打開ClientApp項目的Program.cs文件,添加以下using語句
using System.Net.Http;
添加一個靜態的HttpClient實例:
namespace ClientApp { class Program { static HttpClient client = new HttpClient(); static void Main(string[] args) { } } }
添加三個方法 得到全部產品列表信息,經過ID得到指定產品信息,經過目錄得到產品列表信息。
static void ListAllProducts() { HttpResponseMessage resp = client.GetAsync("api/products").Result; resp.EnsureSuccessStatusCode(); var products = resp.Content.ReadAsAsync<IEnumerable<SelfHost.Product>>().Result; foreach (var p in products) { Console.WriteLine("{0} {1} {2} ({3})", p.Id, p.Name, p.Price, p.Category); } } static void ListProduct(int id) { var resp = client.GetAsync(string.Format("api/products/{0}", id)).Result; resp.EnsureSuccessStatusCode(); var product = resp.Content.ReadAsAsync<SelfHost.Product>().Result; Console.WriteLine("ID {0}: {1}", id, product.Name); } static void ListProducts(string category) { Console.WriteLine("Products in '{0}':", category); string query = string.Format("api/products?category={0}", category); var resp = client.GetAsync(query).Result; resp.EnsureSuccessStatusCode(); var products = resp.Content.ReadAsAsync<IEnumerable<SelfHost.Product>>().Result; foreach (var product in products) { Console.WriteLine(product.Name); } }
每一個方法遵循相同的模式:
1.調用HttpClient.GetAsync來發送一個HTTP Get請求到適當的URI。
2.調用HttpResponseMessage.EnsureSuccessStatusCode ,若是HTTP響應狀態是一個錯誤碼,那麼這個方法將拋出一個異常。
3.調用ReadAsAsync<T> 反序列化一個來自HTTP響應的CLR類型。 這個方法是一個擴展方法,被定義在System.Net.Http.HttpContentExtensions。
GetAsync 和ReadAsAsync 這兩個方法都是異步方法。它們經過返回Task 對象來表明異步操做。獲取Result屬性阻止線程,直到操做完成。
在調用這些方法以前, BaseAddress 上的屬性設置爲"http://localhost:8080"的 HttpClient 實例。例如:
static void Main(string[] args) { client.BaseAddress = new Uri("http://localhost:8080"); ListAllProducts(); ListProduct(1); ListProducts("toys"); Console.WriteLine("Press Enter to quit."); Console.ReadLine(); }
接下來,進行測試。設置啓動項目。
預測輸出內容,應該會輸出如下內容:
1 Tomato Soup 1.0 (Groceries) 2 Yo-yo 3.75 (Toys) 3 Hammer 16.99 (Hardware) ID 1: Tomato Soup Products in 'toys': Yo-yo Press Enter to quit.
運行程序,查看結果
總結
感受仍是比較簡單的吧,就這樣一步一步的下來仍是沒什麼阻礙的。
本文的參考連接http://www.asp.net/web-api/overview/hosting-aspnet-web-api/self-host-a-web-api
本文已同步到Web API系列導航 http://www.cnblogs.com/aehyok/p/3446289.html
本文示例代碼下載連接http://pan.baidu.com/s/1d56zf