這段時間的博客打算和你們一塊兒分享下webapi的使用和心得,主要緣由是羣裏面有朋友說但願能有這方面的文章分享,隨便本身也再回顧下;後面將會和你們分不一樣篇章來分享交流心得,但願各位多多掃碼支持和點贊,謝謝,但願你們喜歡:web
. 使用vs建立webapi項目及項目結構介紹api
. 默認路由模板介紹瀏覽器
. 屬性路由標記的使用mvc
下面一步一個腳印的來分享:框架
. 使用vs建立webapi項目及項目結構介紹ide
首先,鼠標右鍵解決方案=》添加=》新建項目=》選擇"Asp.net web應用程序"=》輸入項目的名稱,我這裏是Stage.Api=》點擊肯定按鈕,效果如:函數
而後會彈出一個界面,裏面有三種模板選擇,這裏簡單介紹下;測試
1. 選擇"Empty模板"=》勾選"Web Api",若是不須要測試的話便可點擊"肯定"按鈕就好了,而後解決方案中會生成一個很空的api項目,這裏簡單截圖下選擇的界面圖:網站
2. 選擇「MVC」=》勾選「Web API」=》點擊「肯定」,這個界面能夠更改身份驗證,如圖:this
3. 選擇「Web API」=》直接點擊「肯定」(這裏始終是選擇mvc+webapi,其實就是上面的選擇項),這裏就再也不截圖了各位一嘗試點擊下試試;
我這裏就選擇webapi來建立項目,目錄結構和說明如:
由於前面建立項目時候勾選了「MVC」與「Web API」,因此這個項目中包括了二者的初始文件,由目錄結構能看出mvc和webapi相識度很高,除了試圖外幾乎能承認同樣,固然具體代碼仍是有差異的,下面咱們就開始來初步瞭解下webapi的routing吧;
. 默認路由模板介紹
首先,這裏只說webapi的默認路由,來看App_Start/WebApiConfig.cs文件中默認路由類代碼以下:
1 public static class WebApiConfig 2 { 3 public static void Register(HttpConfiguration config) 4 { 5 // Web API configuration and services 6 7 // Web API routes 8 config.MapHttpAttributeRoutes(); 9 10 config.Routes.MapHttpRoute( 11 name: "DefaultApi", 12 routeTemplate: "api/{controller}/{id}", 13 defaults: new { id = RouteParameter.Optional } 14 ); 15 } 16 }
這個 Register 方法傳遞的參數 HttpConfiguration 類型;而後 config.MapHttpAttributeRoutes(); 主要功能是:容許項目框架可使用屬性標記來擴展路由; config.Routes.MapHttpRoute 對應有四個擴展方法,代碼如:
1 // 2 // 摘要: 3 // 映射指定的路由模板。 4 // 5 // 參數: 6 // routes: 7 // 應用程序的路由的集合。 8 // 9 // name: 10 // 要映射的路由的名稱。 11 // 12 // routeTemplate: 13 // 路由的路由模板。 14 // 15 // 返回結果: 16 // 對映射路由的引用。 17 public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate); 18 // 19 // 摘要: 20 // 映射指定的路由模板並設置默認路由值。 21 // 22 // 參數: 23 // routes: 24 // 應用程序的路由的集合。 25 // 26 // name: 27 // 要映射的路由的名稱。 28 // 29 // routeTemplate: 30 // 路由的路由模板。 31 // 32 // defaults: 33 // 一個包含默認路由值的對象。 34 // 35 // 返回結果: 36 // 對映射路由的引用。 37 public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults); 38 // 39 // 摘要: 40 // 映射指定的路由模板並設置默認路由值和約束。 41 // 42 // 參數: 43 // routes: 44 // 應用程序的路由的集合。 45 // 46 // name: 47 // 要映射的路由的名稱。 48 // 49 // routeTemplate: 50 // 路由的路由模板。 51 // 52 // defaults: 53 // 一個包含默認路由值的對象。 54 // 55 // constraints: 56 // 一組表達式,用於限制 routeTemplate 的值。 57 // 58 // 返回結果: 59 // 對映射路由的引用。 60 public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults, object constraints); 61 // 62 // 摘要: 63 // 映射指定的路由模板並設置默認的路由值、約束和終結點消息處理程序。 64 // 65 // 參數: 66 // routes: 67 // 應用程序的路由的集合。 68 // 69 // name: 70 // 要映射的路由的名稱。 71 // 72 // routeTemplate: 73 // 路由的路由模板。 74 // 75 // defaults: 76 // 一個包含默認路由值的對象。 77 // 78 // constraints: 79 // 一組表達式,用於限制 routeTemplate 的值。 80 // 81 // handler: 82 // 請求將被調度到的處理程序。 83 // 84 // 返回結果: 85 // 對映射路由的引用。 86 public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults, object constraints, HttpMessageHandler handler);
具體的參數說明已經備註好了,經過備註咱們簡單總結下name:某類模板的惟一名稱,routeTemplate:路由模板,defaults:默認參數;咱們自動生成的默認模板格式如: api/{controller}/{id} ,由經驗得出這裏的Controller指的就是咱們在Controllers文件夾中建立的apiController的名稱,id對應的是參數,這裏有默認值 RouteParameter.Optional 表示id參數可選傳遞;好了經過參數的分析講解說明,咋們來在瀏覽器中訪問下咱們自動生成的模板地址,看能獲得什麼數據,我這裏是經過iis指向了我這個webapi項目,訪問的地址如: http://localhost:1001/api/values ,這個時候會出現一個錯誤:
不要慌張,這個所因爲咱們初建項目,沒有生成形成的(這裏簡單描述下網站和項目的最大使用區別,1.網站若是是更新了web頁面的代碼,不須要從新生成 2.若是是項目的話修改了代碼必需要從新生成,否則發佈沒有任何效果),好咋們生成後,從新在瀏覽器中訪問上面的地址,獲得以下結果:
再來看一下對應的代碼文件 Controllers/ValuesController.cs ,而後代碼如:
1 // GET api/values 2 public IEnumerable<string> Get() 3 { 4 return new string[] { "value1", "value2" }; 5 }
咱們獲得的結果就是這段代碼執行出來的數據;
. 屬性路由標記的使用
這裏先來講下,webapi經常使用到的容許訪問方式的標記有GET,POST,PUT,DELETE等,有朋友立馬就反應過來這幾乎和MVC試圖中的設置差很少呢,是的就是這樣;而後再來了解下路由標記Route的使用,先來看一段代碼:
1 // GET api/values 2 [Route("webapi")] 3 public IEnumerable<string> Get() 4 { 5 return new string[] { "value1", "value2" }; 6 }
仔細的朋友可以發現這裏就是上面咱們直接訪問 http://localhost:1001/api/values 地址的測試代碼,如今咱們增長了標記 [Route("webapi")] 有什麼做用呢,咋們先來生成下項目,而後再訪問以前使用的地址 http://localhost:1001/api/values 獲得的結果如:
此時咱們沒法正常獲得剛纔的文字結果,這是由於Route標記吧路由地址改成 http://localhost:1001/webapi 這樣直接訪問action的方法,好咋們使用該地址在瀏覽器得出結果以下:
和加Route以前獲得的結果是同樣的,由此咱們獲得Route標記有改變路由地址的功能,下面咱們來看下Route類代碼:
1 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)] 2 public sealed class RouteAttribute : Attribute, IHttpRouteInfoProvider 3 { 4 public RouteAttribute(); 5 public RouteAttribute(string template); 6 7 public string Name { get; set; } 8 public int Order { get; set; } 9 public string Template { get; } 10 }
由上可知咱們剛纔使用到了 RouteAttribute(string template) 構造函數來傳遞對應的參數,看代碼中Order,Name兩個屬性,這個可能會在從此講解中使用到,之後再說;下面咱們再來看RoutePrefix及她的一段代碼相關代碼:
1 [RoutePrefix("v")] 2 public class ValuesController : ApiController
再來訪問咱們剛纔的地址: http://localhost:1001/webapi ,此時獲得的錯誤信息「沒法找到資源。」,那咱們再來改變下路徑如: http://localhost:1001/v/webapi ,能正常獲得結果:
由此RoutePrefix的效果,體現出來了,若是這是了該標記,就須要咱們訪問api地址時,須要加上對應的v才行,這個對應的代碼是:
1 [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)] 2 public sealed class RoutePrefixAttribute : Attribute 3 { 4 public RoutePrefixAttribute(string prefix); 5 6 public string Prefix { get; } 7 }
好了,本篇就到這裏了,主要是電腦沒電了,下次繼續分享webapi文章,但願各位多多支持,勿噴。