真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C#WebApi路由機(jī)制剖析

前言:從MVC到WebApi,路由機(jī)制一直是伴隨著這些技術(shù)的一個(gè)重要組成部分。

創(chuàng)新互聯(lián)成立與2013年,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站制作、成都做網(wǎng)站網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元富源做網(wǎng)站,已為上家服務(wù),為富源各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18980820575

它可以很簡(jiǎn)單:如果你僅僅只需要會(huì)用一些簡(jiǎn)單的路由,如/Home/Index,那么你只需要配置一個(gè)默認(rèn)路由就能簡(jiǎn)單搞定;

它可以很神秘:你的url可以千變?nèi)f化,看到一些看似“無(wú)厘頭”的url,感覺(jué)很難理解它如何找到匹配的action,例如/api/user/1/detail,這樣一個(gè)url可以讓你糾結(jié)半天。

它可以很晦澀:當(dāng)面試官提問(wèn)“請(qǐng)簡(jiǎn)單分析下MVC路由機(jī)制的原理”,你可能事先就準(zhǔn)備好了答案,然后噼里啪啦一頓(型如:UrlRoutingModule→Routes→RouteData→RequestContext→Controller),你可能回答很流利,但并不一定能理解這些個(gè)對(duì)象到底是啥意思。兩年前的面試,博主也這樣做過(guò)。

博主覺(jué)得,究竟路由機(jī)制在你的印象中處于哪一面,完全取決于你的求知欲。路由機(jī)制博大精深,博主并未完全理解,但博主是一個(gè)好奇心重的人,總覺(jué)得神秘的東西就得探索個(gè)究竟。今天,博主根據(jù)自己的理解,分享下WebApi里面路由的原理以及使用,如有考慮不周,歡迎園友們指正。

一、MVC和WebApi路由機(jī)制比較

1、MVC里面的路由

在MVC里面,默認(rèn)路由機(jī)制是通過(guò)url路徑去匹配對(duì)應(yīng)的action方法,比如/Home/GetUser這個(gè)url,就表示匹配Home這個(gè)Controller下面的GetUser方法,這個(gè)很好理解,因?yàn)樵贛VC里面定義了一個(gè)默認(rèn)路由,在App_Start文件夾下面有一個(gè)RouteConfig.cs文件

C# WebApi 路由機(jī)制剖析

public class RouteConfig
 {
  public static void RegisterRoutes(RouteCollection routes)
  {
   routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

   routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Department", action = "Index", id = UrlParameter.Optional }
   );
  }
 }

url: "{controller}/{action}/{id}"這個(gè)定義了我們url的規(guī)則,{controller}/{action}定義了路由的必須參數(shù),{id}是可選參數(shù)

2、WebApi里面的路由

和MVC里面的路由有點(diǎn)不同,WebApi的默認(rèn)路由是通過(guò)http的方法(get/post/put/delete)去匹配對(duì)應(yīng)的action,也就是說(shuō)webapi的默認(rèn)路由并不需要指定action的名稱。還是來(lái)看看它的默認(rèn)路由配置,我們新建一個(gè)Webapi項(xiàng)目,在App_Start文件夾下面自動(dòng)生成一個(gè)WebApiConfig.cs文件:

C# WebApi 路由機(jī)制剖析

public static class WebApiConfig
 {
  public static void Register(HttpConfiguration config)
  {
   // Web API 路由
   config.MapHttpAttributeRoutes();

   config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
   );
  }
 }

和MVC類似,routeTemplate: "api/{controller}/{id}"這個(gè)定義了路由的模板,api/{controller}是必選參數(shù),{id}是可選參數(shù),那么問(wèn)題就來(lái)了,如果我們的url不包含action的名稱,那么如何找到請(qǐng)求的方法呢?我們先來(lái)簡(jiǎn)單看一個(gè)例子:

public class OrderController : ApiController
 {
  [HttpGet]
  public object GetAll()
  {
   return "Success";
  }
 }

我們通過(guò)url來(lái)訪問(wèn)

C# WebApi 路由機(jī)制剖析

說(shuō)明請(qǐng)求能夠成功。

為什么這個(gè)請(qǐng)求能夠成功呢?那是因?yàn)?,?dāng)我們?cè)L問(wèn)http://localhost:21528/api/Order這個(gè)路徑的時(shí)候,webapi的路由引擎會(huì)自動(dòng)去匹配"api/{controller}/{id}"這個(gè)模板,于是找到了控制器是Order這個(gè),那么問(wèn)題來(lái)了?它是如何定位到GetAll()這個(gè)方法的呢?這里就是和MVC不同的地方,前面說(shuō)過(guò),Webapi的路由規(guī)則是通過(guò)http方法去匹配對(duì)應(yīng)的action,那么,我們通過(guò)瀏覽器訪問(wèn)http://localhost:21528/api/Order這個(gè)路徑的時(shí)候,瀏覽器默認(rèn)通過(guò)url訪問(wèn)的都是get請(qǐng)求,于是webapi的路由引擎就會(huì)去找Order這個(gè)控制器里面的get請(qǐng)求的方法,由于沒(méi)有參數(shù),所以自動(dòng)匹配到了無(wú)參數(shù)的get請(qǐng)求→GetAll()方法,所以請(qǐng)求成功!

當(dāng)然,WebApi也支持MVC里面的路由機(jī)制,但RestFul風(fēng)格的服務(wù)要求請(qǐng)求的url里面不能包含action,所以,在WebApi里面是并不提倡使用MVC路由機(jī)制的。

這是一個(gè)最簡(jiǎn)單的例子,下面我們就來(lái)詳細(xì)看看WebApi里面的路由原理以及使用。

二、WebApi路由基礎(chǔ)

1、默認(rèn)路由

上面我們提到了,新建一個(gè)WebApi服務(wù)的時(shí)候,會(huì)自動(dòng)在WebApiConfig.cs文件里面生成一個(gè)默認(rèn)路由:

 config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
   );

將MapHttpRoute()方法轉(zhuǎn)到定義可以,它有四個(gè)重載方法:

C# WebApi 路由機(jī)制剖析

分別來(lái)看看各個(gè)參數(shù)的作用:

name:"DefaultApi"→表示此路由的名稱,這里只需要保證路由名稱不重復(fù)就OK了。

routeTemplate: "api/{controller}/{id}"→表示路由的url規(guī)則,“api”是固定部分,主要用來(lái)標(biāo)識(shí)當(dāng)前請(qǐng)求的url是一個(gè)api服務(wù)的接口,區(qū)別MVC的路由,當(dāng)然,這里并不是一定要寫成“api”,如果你改成“apiserver”,那么你請(qǐng)求的url里面也需要寫成“apiserver”;“{controller}”是控制器的占位符部分,在真實(shí)的url里面,該部分對(duì)應(yīng)的是具體的控制器的名稱,這個(gè)和MVC里面一致;“{id}”是參數(shù)的占位符部分,表示參數(shù),一般這個(gè)參數(shù)都會(huì)在default里面設(shè)置可選。有了這個(gè)路由模板約束請(qǐng)求的url,比如:我們請(qǐng)求的url寫成http://localhost:21528/Order,那么肯定是找不到對(duì)應(yīng)的路由的,因?yàn)椤癮pi”這個(gè)參數(shù)必選。如果請(qǐng)求的url匹配不到對(duì)應(yīng)的路由,則會(huì)向客戶端返回一個(gè)404的狀態(tài)碼。

defaults: new { id = RouteParameter.Optional }→表示路由的默認(rèn)值,比如上面的routeTemplate,{controller}和{id}部分都可以設(shè)置默認(rèn)值,比如:defaults改成new { controller="Order", id = RouteParameter.Optional },那么我們請(qǐng)求http://localhost:21528/api這個(gè)url仍然能訪問(wèn)到GetAll()方法。

constraints→表示路由約束,一般是一個(gè)約束路由模板的正則表達(dá)式。比如:我們加入約束條件 constraints: new { id = @"\d+" } ,這就約束必須要匹配一到多個(gè)參數(shù)id,那么,我們?cè)贠rderController里面加入另一個(gè)方法

public class OrderController : ApiController
 {

  [HttpGet]
  public object GetAll()
  {
   return "Success";
  }

  [HttpGet]
  public object GetById(int id)
  {
   return "Success" + id ;
  }
 }

我們通過(guò)http://localhost:21528/api/Order/2來(lái)訪問(wèn),得到結(jié)果:

C# WebApi 路由機(jī)制剖析

我們?cè)偻ㄟ^(guò)http://localhost:21528/api/Order/a來(lái)訪問(wèn),得到結(jié)果:

C# WebApi 路由機(jī)制剖析

這個(gè)是很好理解的,id的值不匹配正則表達(dá)式。

而我們?cè)L問(wèn)http://localhost:21528/api/Order。結(jié)果:

C# WebApi 路由機(jī)制剖析

竟然連GetAll()方法都找不到了。這是為什么呢?原來(lái)就是這個(gè)約束在作怪,正則\d+表示匹配一個(gè)或多個(gè)數(shù)字,所以如果請(qǐng)求的url里面沒(méi)有傳數(shù)字,則自動(dòng)匹配不到。所以,如果需要匹配無(wú)參的方法,我們把約束改成這樣:constraints: new { id = @"\d*" },這個(gè)表示匹配0個(gè)或多個(gè)數(shù)字,再來(lái)試試

C# WebApi 路由機(jī)制剖析

這樣就OK了。

上述說(shuō)了那么多都是約束id的,其實(shí)你也可以使用表達(dá)式去約束controller、action等等,但一般不常用,我們就不做過(guò)多講解。

2、自定義路由

上面介紹了這么多,都是關(guān)于默認(rèn)路由原理的介紹。除了默認(rèn)路由,我們也可以自定義路由,我們將WebApiConfig.cs里面改成這樣:

public static class WebApiConfig
 {
  public static void Register(HttpConfiguration config)
  {
   // Web API 路由
   config.MapHttpAttributeRoutes();

   //1.默認(rèn)路由
   config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
   );

   //2.自定義路由一:匹配到action
   config.Routes.MapHttpRoute(
    name: "ActionApi",
    routeTemplate: "actionapi/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
   );

   //3.自定義路由二
   config.Routes.MapHttpRoute(
    name: "TestApi",
    routeTemplate: "testapi/{controller}/{ordertype}/{id}",
    defaults: new { ordertype="aa", id = RouteParameter.Optional }
   );
  }
 }

除了默認(rèn)路由,我們?cè)偌尤肓硗鈨蓚€(gè)自定義路由規(guī)則

2.1、自定義路由一:匹配到action

第一個(gè)自定義路由很好理解,和MVC里面的路由機(jī)制保持一致,只不過(guò)為了區(qū)別默認(rèn)路由,我們將路由模板的前綴改成了“actionapi”。我們通過(guò)這個(gè)自定義的路由也能找到匹配的方法。

比如我們?cè)L問(wèn)http://localhost:21528/actionapi/Order/GetAll,得到結(jié)果:

C# WebApi 路由機(jī)制剖析

通過(guò)action的名稱來(lái)匹配很好理解,上面的GetAll()是方法名,webApi會(huì)默認(rèn)它就是action的名稱,如果你想要方法名和action的名稱不一致,你也可以自定義action的名稱,這個(gè)可以通過(guò)特性ActionName來(lái)實(shí)現(xiàn),如下:

[ActionName("TestActionName")]
  [HttpGet]
  public object GetById(int id)
  {
   return "Success" + id ;
  }

測(cè)試結(jié)果:

C# WebApi 路由機(jī)制剖析

之前博主演示參數(shù)和返回值的時(shí)候都是使用的匹配到action的路由。這種用法和MVC里面保持一致,比較好理解,但是WebApi里面并不提倡。

2.2、自定義路由二

第二個(gè)自定義路由第一眼看上去是不太好理解的,沒(méi)關(guān)系,我們先來(lái)按照它的路由模板規(guī)則使用試試。

C# WebApi 路由機(jī)制剖析

通過(guò)http://localhost:21528/testapi/Order/aa/匹配到GetAll()方法

C# WebApi 路由機(jī)制剖析

通過(guò)http://localhost:21528/testapi/Order/aa/2匹配到的是GetById()方法

C# WebApi 路由機(jī)制剖析

通過(guò)http://localhost:21528/testapi/Order/bb/2匹配到的也是GetById()方法。

什么意思呢?也就是說(shuō),只要{ordertype}按照路由規(guī)則去配置,都能找到對(duì)應(yīng)的方法。這里的{ordertype}有什么用呢?這個(gè)要留在下面介紹特性路由的時(shí)候來(lái)解釋。

3、路由原理

有了上面的這些理論作為基礎(chǔ),我們?cè)賮?lái)分析下WebApi里面路由機(jī)制的原理以及路由匹配的過(guò)程。由于WebApi的路由機(jī)制和MVC有許多的相似性,所以要想理解Webapi的路由機(jī)制,有需要搬出來(lái)那些asp.net Rounting里面的對(duì)象。這個(gè)過(guò)程有點(diǎn)復(fù)雜,博主就根據(jù)自己的理解,提提一些主要的過(guò)程:

1、WebApi服務(wù)啟動(dòng)之后,會(huì)執(zhí)行全局配置文件Global.asax.cs的protected void Application_Start(){GlobalConfiguration.Configure(WebApiConfig.Register);}方法,通過(guò)參數(shù)委托執(zhí)行WebApiConfig.cs里面的public static void Register(HttpConfiguration config)這個(gè)方法,將所有配置的路由信息添加到HttpRouteCollection對(duì)象中(MVC里面可能是RoutCollection對(duì)象)保存起來(lái)。這里的HttpRoutCollection對(duì)象的實(shí)例名是Routes,這個(gè)很重要,后面要用到。

2、當(dāng)我們發(fā)送請(qǐng)求到WebApi服務(wù)器的時(shí)候,比如我們?cè)L問(wèn)http://localhost:21528/api/Order這個(gè)url的時(shí)候,請(qǐng)求首先還是會(huì)被UrlRoutingModule監(jiān)聽(tīng)組件截獲,然后,將截獲的請(qǐng)求在Routes路由集合中匹配到對(duì)應(yīng)的路由模板(如果匹配不到對(duì)應(yīng)的路由模板,則返回404),得到對(duì)應(yīng)的IHttpRoute對(duì)象。IHttpRoute對(duì)象是Routes集合里面匹配到的一個(gè)實(shí)體。

3、將IHttpRoute對(duì)象交給當(dāng)前的請(qǐng)求的上下文對(duì)象RequestContext處理,根據(jù)IHttpRoute對(duì)象里面的url匹配到對(duì)應(yīng)的controller,然后再根據(jù)http請(qǐng)求的類型和參數(shù)找到對(duì)應(yīng)的action。這樣一個(gè)請(qǐng)求就能找到對(duì)應(yīng)的方法了。

這個(gè)過(guò)程本身是非常復(fù)雜的,為了簡(jiǎn)化,博主只選擇了最主要的幾個(gè)過(guò)程。更詳細(xì)的路由機(jī)制可以參考:https://www.jb51.net/article/143216.htm。這文章寫得有點(diǎn)深,有興趣的可以看看。

三、WebApi路由過(guò)程

通過(guò)上文路由的過(guò)程,我們知道,一個(gè)請(qǐng)求過(guò)來(lái)之后,路由主要需要經(jīng)歷三個(gè)階段

  • 根據(jù)請(qǐng)求的url匹配路由模板
  • 找到控制器
  • 找到action

1、根據(jù)請(qǐng)求的url匹配路由模板

這點(diǎn)上面已經(jīng)說(shuō)了很多了,主要就是路由模板的配置和url的匹配。在此不作過(guò)多說(shuō)明。

2、找到控制器

如果你反編譯路由模塊的代碼,你會(huì)發(fā)現(xiàn)控制器的選擇主要在IHttpControllerSelector這個(gè)接口的SelectController()方法里面處理。

C# WebApi 路由機(jī)制剖析

該方法將當(dāng)前的請(qǐng)求以HttpRequestMessage對(duì)象作為參數(shù)傳入,返回HttpControllerDescriptor對(duì)象。這個(gè)接口默認(rèn)由DefaultHttpControllerSelector這個(gè)類提供實(shí)現(xiàn)

C# WebApi 路由機(jī)制剖析

默認(rèn)實(shí)現(xiàn)的方法里面大致的算法機(jī)制是:首先在路由字典中找到實(shí)際的控制器的名稱(比如“Order”),然后在此控制器名稱上面加上字符串“Controller”的到請(qǐng)求控制器的全稱(比如“OrderController”),最后找到對(duì)應(yīng)的WebApi的Controller,實(shí)例化就得到當(dāng)前請(qǐng)求的控制器對(duì)象。

3、找到action

得到了控制器對(duì)象之后,Api引擎通過(guò)調(diào)用IHttpActionSelector這個(gè)接口的SelectAction()方法去匹配action。這個(gè)過(guò)程主要包括:

  1. 解析當(dāng)前的http請(qǐng)求,得到請(qǐng)求類型(是get、post、put還是delete)
  2. 如果路由模板配置了{(lán)action},則直接取到url里面的action名稱
  3. 解析請(qǐng)求的參數(shù)

如果路由模板配置了{(lán)action},那么找到對(duì)應(yīng)的action就很簡(jiǎn)單,如果沒(méi)有配置action,則會(huì)首先匹配請(qǐng)求類型(get/post/put/delete等),然后匹配請(qǐng)求參數(shù),找到對(duì)應(yīng)的action。我們看個(gè)例子,比如,我們的controller加如下一些方法。

public class OrderController : ApiController
 {
  [HttpGet]
  public IHttpActionResult GetAll()
  {
   return Ok("Success");
  }

  [HttpGet]
  public IHttpActionResult GetById(int id)
  {
   return Ok("Success" + id );
  }

  [HttpPost]
  public HttpResponseMessage PostData(int id)
  {
   return Request.CreateResponse();
  }

  [HttpPost]
  public HttpResponseMessage SavaData(ORDER order)
  {
   return Request.CreateResponse();
  }

  [HttpPut]
  public IHttpActionResult Put(int id)
  {
   return Ok();
  }

  [HttpDelete]
  public IHttpActionResult DeleteById(int id)
  {
   return Ok();
  }
 }

匹配action的結(jié)果

urlhttp方法參數(shù)結(jié)果
http://localhost:21528/api/Ordergetnone匹配GetAll方法
http://localhost:21528/api/Ordergetid匹配GetById方法
http://localhost:21528/api/Orderpostorder匹配SavaData方法
http://localhost:21528/api/Orderputid匹配Put方法 
http://localhost:21528/api/Orderdeleteid匹配DeleteById方法 

WebApi還提供了一個(gè)action同時(shí)支持多個(gè)http方法的請(qǐng)求,使用AcceptVerbs特性去標(biāo)記。但博主覺(jué)得實(shí)際使用并不多,有興趣的可以了解下。

 [AcceptVerbs("GET", "POST")]
  public IHttpActionResult GetById(int id)
  {
   return Ok("Success" + id );
  }

四、WebApi特性路由

上面說(shuō)了這么多都是路由的一些全局配置。并且存在問(wèn)題:

如果http請(qǐng)求的方法相同(比如都是post請(qǐng)求),并且請(qǐng)求的參數(shù)也相同。這個(gè)時(shí)候似乎就有點(diǎn)不太好辦了,這種情況在實(shí)際項(xiàng)目中還是比較多的。比如

public class OrderController : ApiController
 {
  //訂單排產(chǎn)
  [HttpPost]
  public void OrderProduct([FromBody]string strPostData)
  {

  }

  //訂單取消
  [HttpPost]
  public void OrderCancel([FromBody]string strPostData)
  {
   
  }

  //訂單刪除
  [HttpPost]
  public void OrderDelete([FromBody]string strPostData)
  {
   
  }
 }

這個(gè)時(shí)候如果使用我們上面講的Restful風(fēng)格的路由是解決不了這個(gè)問(wèn)題的。當(dāng)然,有園友可能就說(shuō)了,既然這樣,我們?cè)诼酚赡0謇锩婕由稀皗action}”不就搞定了么!這樣確實(shí)可行。但還是那句話,不提倡。我們來(lái)看看如何使用特性路由解決這個(gè)問(wèn)題。

1、啟動(dòng)特性路由

如果要使用特性路由,首先在WebApiConfig.cs的Register方法里面必須先啟用特性路由:

public static void Register(HttpConfiguration config)
  {
   // 啟用Web API特性路由
   config.MapHttpAttributeRoutes();

   //1.默認(rèn)路由
   config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
   );
  }

一般情況下,當(dāng)我們新建一個(gè)WebApi項(xiàng)目的時(shí)候,會(huì)自動(dòng)在Register方法里面加上這句話。

2、最簡(jiǎn)單的特性路由

我們?cè)贠rderController這個(gè)控制器里面加這個(gè)action

[Route("Order/SaveData")]
  [HttpPost]
  public HttpResponseMessage SavaData(ORDER order)
  {
   return Request.CreateResponse();
  }

然后我們通過(guò)Web里面的Ajax調(diào)用

$(function () {
 $.ajax({
  type: 'post',
  url: 'http://localhost:21528/Order/SaveData',
  data: { ID: 2, NO:"aaa"},
  success: function (data, status) {
   alert(data);
  }
 });
});

得到結(jié)果:

C# WebApi 路由機(jī)制剖析

當(dāng)然,有人可能就有疑義了,這個(gè)特性路由的作用和“{action}”的作用一樣嘛,其實(shí)不然,如果這里改成[Route("Test/AttrRoute")],然后請(qǐng)求的url換成http://localhost:21528/Test/AttrRoute,一樣能找到對(duì)應(yīng)的action。

C# WebApi 路由機(jī)制剖析

特性路由的目的是為了解決我們公共路由模板引擎解決不了的問(wèn)題。一個(gè)action定義了特性路由之后,就能通過(guò)特性路由上面的路由規(guī)則找到。

3、帶參數(shù)的特性路由

特性路由的規(guī)則可以使用“{}”占位符動(dòng)態(tài)傳遞參數(shù),比如我們有這樣一個(gè)特性路由

[Route("ordertype/{id}/order")]
  [HttpGet]
  public IHttpActionResult GetById(int id)
  {
   return Ok("Success" + id );
  }

在瀏覽器里面調(diào)用

C# WebApi 路由機(jī)制剖析

調(diào)用成功。到此,我們就能看懂本文最開(kāi)始那個(gè)看似“怪異”的路由→/api/user/1/detail這個(gè)了。

4、參數(shù)的約束和默認(rèn)值

[Route("api/order/{id:int=3}/ordertype")]
  [HttpGet]
  public IHttpActionResult GetById(int id)
  {
   return Ok("Success" + id );
  }

這里約束可變部分{id}的取值必須是int類型。并且默認(rèn)值是3.

看看效果

C# WebApi 路由機(jī)制剖析

C# WebApi 路由機(jī)制剖析

不滿足約束條件,則直接返回404。

5、路由前綴

在正式項(xiàng)目中,同一個(gè)控制器的所有的action的所有特性路由標(biāo)識(shí)一個(gè)相同的前綴,這種做法并非必須,但這樣能夠增加url的可讀性。一般的做法是在控制器上面使用特性[RoutePrefix]來(lái)標(biāo)識(shí)。

[RoutePrefix("api/order")]
 public class OrderController : ApiController
 {
  [Route("")]
  [HttpGet]
  public IHttpActionResult GetAll()
  {
   return Ok("Success");
  }

  [Route("{id:int}")]
  [HttpGet]
  public IHttpActionResult GetById(int id)
  {
   return Ok("Success" + id );
  }

  [Route("postdata")]
  [HttpPost]
  public HttpResponseMessage PostData(int id)
  {
   return Request.CreateResponse();
  }
 }

那么這個(gè)這個(gè)控制器的action的時(shí)候,都需要/api/order開(kāi)頭,后面接上action特性路由的規(guī)則。

五、第一個(gè)Restful風(fēng)格的WebApi服務(wù)

通過(guò)以上,我們就可以構(gòu)造一個(gè)Restful風(fēng)格的WebApi服務(wù)。

[RoutePrefix("api/AttrOrder")]
 public class OrderController : ApiController
 {
  [Route("")]
  [HttpGet]
  public IHttpActionResult GetAll()
  {
   return Ok("Success");
  }

  [Route("{id:int=3}/OrderDetailById")]
  [HttpGet]
  public IHttpActionResult GetById(int id)
  {
   return Ok("Success" + id );
  }

  [Route("{no}/OrderDetailByNo")]
  [HttpGet]
  public IHttpActionResult GetByNO(string no)
  {
   return Ok("Success" + no);
  }

  [Route("{name}/OrderDetailByName")]
  [HttpGet]
  public IHttpActionResult GetByName(string name)
  {
   return Ok("Success" + name);
  }

  [Route("postdata")]
  [HttpPost]
  public HttpResponseMessage PostData(int id)
  {
   return Request.CreateResponse();
  }

  [Route("Test/AttrRoute")]
  [HttpPost]
  public HttpResponseMessage SavaData(ORDER order)
  {
   return Request.CreateResponse();
  }
 }

得到結(jié)果

C# WebApi 路由機(jī)制剖析

六、總結(jié)

整了這么久終于整完了。如果你覺(jué)得本文對(duì)你有幫助,請(qǐng)幫忙博主推薦,您的支持是博主最大的動(dòng)力!

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。


文章名稱:C#WebApi路由機(jī)制剖析
文章鏈接:http://weahome.cn/article/peeojg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部