一、WebApi路由机制是什么?
路由机制通俗点来说:其实就是WebApi框架将用户在浏览器中输入的Url地点和路由表中的路由进行匹配,并按照最终匹配的路由去寻找并匹配相应的Controller和Action并执行的一个过程。
从WebApi框架接收到来自外部环境的接口挪用请求到指定接口的执行概略需要以下的匹配过程:1、匹配URL路由 2、Controller匹配 3、Action匹配
下面我么分袂对这几个流程进行详细说明。
二、匹配URL路由
WebApi框架接收到来自外部的接口请求后,首先将路由表中的路由一条一条和Url地点进行匹配,一旦匹配上则不再继续往下匹配,如果匹配完了所有路由都未匹配上,则会报404错误。
如果告成匹配上指定路由,则框架按照路由的Url模板中指定的Controller的地址位置以及Action的地址位置从用户请求的Url中提取出将要挪用的Controller的名称以及Action的名称,固然要被挪用的Controller名或者Action名也可能不是从用户倡议的接口挪用请求Url中获得的,因为WebApi中在进行路由配置时供给了参数默认值的配置,也就是说Controller名或者Action名可能来源于路由配置时的默认值。
该流程结束后:WebApi框架将会从用户请求的接口挪用URL中提取出用户想挪用的接口所对应的Controller 、Action 、以及用户传给指定Action的参数(即路由数据)等等,
这些数据存储在了一个字典调集中,这个路由数据字典我们可以在Action要领中通过如下方法获得:
1 IHttpRouteData routeData = Request.GetRouteData(); 2 IDictionary<string, object> routeDataValues = routeData.Values;
这里需要澄清的几点的是:
1、URL未匹配上任何路由 和 匹配上了路由但是未找到相应的Controller和Action 是两个差此外观点,IIS对这两种情况的响应是不一样的。
URL未匹配上路由:
如果用户请求的接口的地点不能和路由表中的所有路由相匹配,IIS将直接呈报404错误。
匹配上了路由但未找到相应Controller或Action:
如果匹配上了路由但是未找到响应的Controller或Action,那么将报类似如下错误:
MessageDetail节点详细描述了是 Controller未找到还是 Action未找到。
2、由于路由表中可以配置一条或者多条路由,并且WebApi框架在匹配告成一条路由后将不再继续往下匹配,也就是说即使此时后面还有路由可以
和当前请求匹配也不会被匹配到,所以请务必注意每条路由的配置挨次,否则可能造成意想不到的功效。
如:
1 public static void Register(HttpConfiguration config) 2 { 3 config.Routes.MapHttpRoute( 4 name: "TestRoute", 5 routeTemplate: "{controller}/{action}", 6 defaults: new { action = "Index" } 7 ); 8 config.Routes.MapHttpRoute( 9 name: "DefaultApi", 10 routeTemplate: "api/{controller}/{id}", 11 defaults: new { id = RouteParameter.Optional } 12 ); 13 14 }
假设我们此时代码中包罗如下控制器和Action:
1 public class ValuesController : ApiController 2 { 3 public string Get() 4 { 5 return "value"; 6 } 7 [HttpGet] 8 public object QueryValues(int index) 9 { 10 string[] strs = new string[] { "张三", "李四" }; 11 if (index < 0 || index >= strs.Length) 12 { 13 return JsonConvert.SerializeObject(strs); 14 } 15 return strs[index]; 16 } 17 }
我们在浏览器中输入::16982/api/Values,会发明总是匹配到的是TestRoute这个路由,实际上我们只是想访谒Values中的无参数的Get要领。
事实上,解决这个问题只需要将TestRoute路由的配置放到DefaultApi路由的后面即可。
三、Controller匹配