【ASP.NET Web API2架構揭秘】 初識Web API

來源:互聯網
上載者:User

標籤:

 

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.8Accept-Encoding:gzip, deflate, sdchAccept-Language:zh-CN,zh;q=0.8Cache-Control:max-age=0Host:localhost:3697Proxy-Connection:keep-aliveUser-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就可以了

 

【ASP.NET Web API2架構揭秘】 初識Web API

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.