【ASP.NET Web API2】初識Web API

?

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就可以了

?

轉載于:https://www.cnblogs.com/Sunlimi/p/webapi-start.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259153.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259153.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259153.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

三星s8怎么分屏操作_三星手機該怎么玩?了解完這幾點用機技巧,可以輕車熟路了!...

其實對于三星這個手機品牌&#xff0c;我還是很佩服的。雖然近些年來&#xff0c;三星在國內的市場份額日漸變少&#xff0c;但是在國內的影響力依然尚存。畢竟三星手機在某些方面還是很有優勢的&#xff0c;特別是旗艦系列機型深受消費者喜愛。接下來&#xff0c;筆者就跟大家…

關于條件編譯的問題

這兩天來忙活ucos-II在PIC18fxxx系列上的移植。在編譯的時候老出現變量被多重定義的錯誤。花費了一天的功夫才成功編譯通過&#xff0c;錯誤何在&#xff1f;&#xff1f;就是因為沒有搞明白條件編譯的原理&#xff0c;二是對mcc18編譯器的特點無知。下面學習條件編譯方面的知識…

二維數組的指針復習

最近一次的考試都是指針&#xff0c;真是給我深深上了一課&#xff0c;所以我特此復習一下指針方面的知識。二維數組的指針 int a[3][4] {{1,3,5,7},{9,11,13,15},{17,19,21,23}}; 下面通過一個表來做詳細的說明&#xff1a; 訪問二維數組&#xff0c;有兩種方法&#xff0c;一…

稱重的問題

給你8顆小石頭和一架托盤天平。有7顆石頭的重量是一樣的&#xff0c;另外一顆比其他石頭略重&#xff1b;除此之外&#xff0c;這些石頭完全沒有分別。你不得假設那顆重頭到底比其他的石頭重了多少。請問&#xff1a;最少要稱量幾次&#xff0c;你才能把那顆較重的石頭找出來&a…

TIF圖像文件的讀取(c++代碼)

一 TIF圖像介紹 TIFF是最復雜的一種位圖文件格式。TIFF是基于標記的文件格式&#xff0c;它廣泛地應用于對圖像質量要求較高的圖像的存儲與轉換。由于它的結構靈活和包容性大&#xff0c;它已成為圖像文件格式的一種標準&#xff0c;絕大多數圖像系統都支持這種格式。 TIFF 是一…

g menu i meun_長沙話讀“這里”,到底是閣(gó)里還是該(gái)里

“帶籠子”、“打抱秋”……這些地道的長沙話&#xff0c;長沙人&#xff0c;你有多久沒聽過了&#xff1f;/ 長沙人&#xff0c;你還記得長沙話嗎 / “去了很多地方&#xff0c;最后還是回到了長沙”“我聽見了一句長沙話&#xff0c;就想回長沙了。”逗霸妹聽過很多人回長沙的…

git使用---工作區和暫存區

轉載于:https://www.cnblogs.com/momo-unique/articles/4380551.html

UC/OS-II的學習

粗略的的看了邵貝貝老師的那本書&#xff0c;感覺有點眉目。UC/OS-II的全局變量繁多&#xff0c;剛接觸的時候容易弄混淆&#xff0c;現在總結下&#xff1a; OSRunning&#xff1a; 用于標識多任務環境是否已經開啟運行&#xff0c;在OSStart()函數里啟動任務后就置為True。 …

偶數哥德巴赫猜想

已知不小于6的偶數都可以分成兩個素數之和。請編寫6到100000的所有偶數的分解&#xff0c;若有一個偶數可以分解成多個素數之和&#xff0c;只需寫出一種即可。 #include <iostream> #include <algorithm> using namespace std;bool isprime(int n)//判斷素數{int …

[20170420]表達式加0或者減0不一樣.txt

[20170420]表達式加0或者減0不一樣.txt --//oracle 有時候避免某個索引采用字段0或者-0的方式&#xff0c;不使用索引&#xff0c;但是兩者存在一點點區別&#xff0c;通過例子說明。 1.環境&#xff1a; SCOTTbook> &r/ver1 PORT_STRING VERSION …

MAPLAP開發環境中release模式和debug模式燒寫.hex文件的不同之處

昨天看了齊工的報告才知道release模式和debug模式燒寫.hex文件的不同。 三&#xff1a;問題分析 1. PIC系列的仿真器和集成開發環境的情況&#xff1a; Release模式和Debug模式是有區別的&#xff1b;Release模式是只把代碼燒錄到單片機的flash區內&#xff0c;上電執行&am…

JavaWeb -- Session實例 -- 自動登錄 和 防止表單重復提交(令牌產生器) MD5碼

1、 自動登錄 http://blog.csdn.net/xj626852095/article/details/16825659 2. 防止表單重復提交 表單Servlet //負責產生表單 public class FormServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletEx…

電腦常見故障處理_彩超常見故障及維修

彩超是醫學檢測手段中重要的環節之一&#xff0c;是對產婦以及對病人進行內部組織和結構觀察的重要方式之一&#xff0c;彩超應用得當可以及早的診斷出病人的疾病&#xff0c;為患者解除疾病的困擾。彩超設備是一種極為先進的診斷系統&#xff0c;一般彩超系統包括以下幾個部分…

微軟歷史最高市值是多少?

有人說微軟在1999 年 12 月達到股價歷史最高點 $58.38并不準確。我1999年12月22日增加微軟&#xff0c;公司依照1999年12月27日的價格&#xff08;119.125&#xff0c;拆股后變為59.5625&#xff09;給了我一筆期權&#xff0c;這個價格&#xff0c;成為微軟股價空前絕后最高點…

京東2016校招編程題

記得有一個大題&#xff0c;說的是給定一個n*n的矩陣&#xff0c;要求從1開始填充矩陣&#xff0c;最后的矩陣是蛇形的。即如下&#xff1a; n3, 7 8 1 6 9 2 5 4 3 n4, 10 11 12 1 9 16 13 2 8 15 14 3 7 6 5 4 給出代碼&#xff1a; #incl…

leetcode21

/*** Definition for singly-linked list.* public class ListNode {* public int val;* public ListNode next;* public ListNode(int x) { val x; }* }*/ public class Solution {public ListNode MergeTwoLists(ListNode l1, ListNode l2) {//遞歸實現鏈表合并…

springmvc02

1&#xff0c;創建實體類對象User 注意要導入 bean-validator.jar 包 package com.yangw.springmvc.entity;import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.NotEmpty; import org.hibernate.validator.constraints.Range; im…

用基本信號畫出如下的信號_股市入門基本知識丨下跌時期可以抄底的安全信號有哪些...

點擊藍色字體 關注我們 帶來更多精彩股票市場中的秘籍其實就是“低買高賣”&#xff0c;不過我們不能在大盤一開始下跌的時候就進行買入&#xff0c;因為不清楚下跌的時間&#xff0c;太早介入&#xff0c;只有在反彈幅度超出我們介入的點的時候才可以進行高賣。那么什么時候才…

Flume數據傳輸事務分析[轉]

本文基于ThriftSource,MemoryChannel,HdfsSink三個組件&#xff0c;對Flume數據傳輸的事務進行分析&#xff0c;如果使用的是其他組件&#xff0c;Flume事務具體的處理方式將會不同。一般情況下&#xff0c;用MemoryChannel就好了&#xff0c;我們公司用的就是這個&#xff0c;…

最近的一些校招試題摘錄

最近又參加了一些校招&#xff0c;真是馬不停蹄啊。多參加考試是好的&#xff0c;可以不斷發現一些新的問題。下面摘錄一些我不太會的題。 1.volatile的作用是什么&#xff1f; 答案&#xff1a;volatile是類型修飾符&#xff0c;用它修飾的類型變量可能會被編譯器未知的因素…