?
Web Api 是什么?
MSDN:ASP.NET Web API 是一種框架,用于輕松構建可以訪問多種客戶端(包括瀏覽器和移動設備)的 HTTP 服務
百度百科:Web API是網絡應用程序接口。
個人理解:Web API 是提供給多種客戶端對data做CRUD(增刪查改)操作的統一接口
-------------------------------------------
Asp.net Web API 支持多種寄宿方式
1,IIS作為宿主(創建一個Asp.net web應用程序作為Web API 的宿主)
2,自宿主(不需要IIS支持,使用任意的應用程序作為宿主【控制臺、Windows Forms、WPF甚至Windows Service】)
?
?
看了Artech大神的一小節Web API,記錄一下學到的東西?
[構建簡單的Web API]
1,以Web Host方式寄宿Web API
? ? ?Visual Studio 為我們提供了專門用于創建ASP.NET Web API應用的項目模板,我們可以一鍵式創建一個完整的APS.NET Web API項目。
這里先不使用Visual Studio自動創建的。我們完全在創建的空項目中編寫我們的程序。
1.1 ?構建解決方案
- ?API: 一個空的類庫項目,表現為HttpController類型的Web API就定義在此項目中
- Model:一個空的類庫項目,實體類定義在這里
- WebHost:一個空的ASP.NET Web應用程序
1.2 定義Web API
? ? ? ?在正式定義Web API 之前,我們需要在項目Model中定義一個代表聯系人的實體類Contact,這里做簡單的定義
public class Contact{public string ID { get; set; }public string Name { get; set; }public string PhoneNum { get;set; }}
?? ? ? ?Web API定義在API項目中,需要繼承ApiController,ApiController定義在程序集“System.Web.Http.dll”, 程序集在“C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web Stack 5\Packages\Microsoft.AspNet.WebApi.Core.5.0.0\lib\net45”可以找到
? ? ? ?在ContactsController中,我們定義了Get、Post、Put、Delete這4個Action,它們分別實現了針對聯系人的查詢、添加、修改、刪除操作。Action方法Get具有一個表示聯系人ID的可缺省參數,如果該參數存在則返回對應的聯系人,否則返回整個聯系人列表。由于ASP.NET Web API默認實現了Action方法與HTTP方法的映射,所以方法名也體現了它們各自能處理的請求必須采用HTTP方法
public class ContactsController : ApiController{List<Contact> contacts;public ContactsController(){contacts = new List<Contact>();contacts.Add(new Contact() { ID = "001", Name = "小白", PhoneNum = "13529093839" });contacts.Add(new Contact() { ID = "002", Name = "大白", PhoneNum = "13529093838" });contacts.Add(new Contact() { ID = "003", Name = "小黑", PhoneNum = "13529088838" });}public IEnumerable<Contact> Get(string id=null) {return from c in contacts where c.ID==id||string.IsNullOrEmpty(id) select c; }public void Post(Contact item) {contacts.Add(item);}public void Put(Contact item) {contacts.Remove(contacts.First(c => c.ID == item.ID));contacts.Add(item);}public void Delete(string id) {contacts.Remove(contacts.First(c => c.ID == id));}}
1.3 將WebHost作為Web API的宿主
? ? WebHost在解決方案中是一個空的ASP.NET Web應用程序,我們還需要為其添加一些必需的程序集引用。
- ? ? System.Web.Http;(\Microsoft.AspNet.WebApi.Core.5.0.0\lib\net45)
- ? ? System.Web.Http.WebHost;(\Microsoft.AspNet.WebApi.WebHost.5.0.0\lib\net45)
- ? ??System.Net.Http;
- ? ??System.Net.Http.Formatting;(\Microsoft.AspNet.WebApi.Client.5.0.0\lib\net45)
? 我們需要在WebHost項目中添加一個Global.asax全局配置文件,注冊一個默認路由,路由系統會解析當前請求訪問的目標HttpController和Action的名稱
?
protected void Application_Start(object sender, EventArgs e){GlobalConfiguration.Configuration.Routes.MapHttpRoute(name: "Default",routeTemplate: "api/{controller}/{id}",defaults: new { id = RouteParameter.Optional });}
?
路由規則中沒有表示目標Action的路由參數,ASP.NET Web API如何根據請求確定哪個Action方法應該被調用呢?其實它能根據請求采用HTTP方法來確定目標Action方法。當然在注冊路由模板中提供代表Action名稱的路由參數({action})也是支持的。
? ? ?現在Web API的以WebHost為宿主的工作就完成了,我們可以利用瀏覽器來調用寄宿的Web API來判斷寄宿工作是否成功。由于瀏覽器在默認情況下訪問我們在地址欄中輸入的地址總是采用HTTP-GET請求,所以我們只能利用它來調用支持HTTP-GET的Action方法,即定義在ContactsController中的Get方法。
?采用Chrome瀏覽器可以看到我們獲取的聯系人列表是XML格式的數據表示,對于ASP.NET Web API 來說,它會優先利用請求報頭"Accept"攜帶的媒體類型來確定相應內容應用的表現形式。
如下所示是Chrome訪問“http://localhost:3697/api/contacts/001”發送請求的內容,它之所以會得到以XML表示的響應是因為“Accept”報頭指定的媒體類型列表中只有“application/xml”被ASP.NET Web API支持。如果我們使用IE,請求的“Accept”報頭將攜帶不同的媒體類型列表,我們實際上會得到以JSON格式表示的響應結果
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:max-age=0
Host:localhost:3697
Proxy-Connection:keep-alive
User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36
我們利用Fiddler來發送調用Web API的HTTP請求,獲取以JSON格式表示的響應結果。
如圖,利用Fiddler發送了一個針對目標地址"http://localhost:3697/api/contacts/001"的Http-GET請求,并添加了一個值為"application/json"的“Accept”報頭,Execute發送請求之后確實得到了Json格式表示的聯系人列表
?
使IIS支持Put和Delete請求
? ? ? ?在定義ContactsController的時候,我們分別采用Get、Post、Put、Delete作為獲取、創建、修改和刪除聯系人的操作所支持的HTTP方法。但是IIS默認是不支持Put和Delete請求的
? ? ? IIS拒絕PUT和DELETE請求是由默認注冊的一個名為"WebDAVModule"的自定義HttpModule導致的。解決這個問題最為直接的方式就是將注冊的HttpModule移除
<system.webServer><modules runAllManagedModulesForAllRequests="true"><remove name="WebDAVModule"/></modules>
</system.webServer>
2,自宿主的方式寄宿Web API
? ?我們在原來的解決方案中添加一個空的控制臺應用程序SelfHost作為宿主
?
?
?
?
跟WebHost一樣,引用解決方案中的API.dll,同樣需要應用一些必需的程序集(紅色為與WebHost不同的)
?
?
- ? ? System.Web.Http;(\Microsoft.AspNet.WebApi.Core.5.0.0\lib\net45)
- ? ? System.Web.Http.SelfHost;(\Microsoft.AspNet.WebApi.SelfHost.5.0.0\lib\net45)
- ? ??System.Net.Http;
- ? ??System.Net.Http.Formatting;(\Microsoft.AspNet.WebApi.Client.5.0.0\lib\net45)
通過前面的WebHost,我們知道接下來需要做的是注冊路由了。在此之前我們還需要動態加載解決方案中的程序集API.dll,
下面是Artech大神在 【在一個空ASP.NET Web項目上創建一個ASP.NET Web API 2.0應用?】中寫的, 有個錯誤的地方httpServer.OpenAsync()后沒有執行Wait()方法,導致計算機并未分配一個端口給程序,這讓我折騰了好久,不過也學到了其他知識,比如:[如何查看計算機某個端口被誰占用]?
?
static void Main(string[] args){ Assembly.Load("API,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null");HttpSelfHostConfiguration configuration = new HttpSelfHostConfiguration("http://127.0.0.1:7304");using (HttpSelfHostServer httpServer = new HttpSelfHostServer(configuration)){httpServer.Configuration.Routes.MapHttpRoute(name: "DefaultApi",routeTemplate: "api/{controller}/{id}",defaults: new { id = RouteParameter.Optional });httpServer.OpenAsync();//糾正:httpServer.OpenAsync().Wait();Console.Read();}}
?
當我們沒有執行Wait()方法時,查看一下計算機是否有分配端口
1,首先調出命令窗口:開始---->運行---->cmd,或者是window+R組合鍵
2,輸入命令:netstat -ano,可以看到所有端口的情況。發現找了幾百遍也是找不到7304端口的
如果你加了Wait(),運行后出現
“HTTP 無法注冊 URL http://+:****/。進程不具有此命名空間的訪問權限(有關詳細信息,請參見 http://go.microsoft.com/fwlink/?LinkId=70353)”
?
你只要以管理員的身份打開Visual Studio就可以了
?