.net web api 的route理解
.NET web api 的特性是和MVC一样,通过Route 来控制action的访问方式。Route匹配规则是个奇特的方式,首先看一段Route的模板
Routes.MapHttpRoute(
name:"DefaultApi",
routeTemplate:"api/{orgid}/{controller}/{id}",
defaults:new {id=RouteParameter.Optional},
constants:new {orgid=@"\d+"} // 这里是给orgid的约束,必须是数字
)
现在我们在定义个Employeecontroller.cs, 在这个controller里面定义两个方法
public void Get(int orgid , int id){}
public void Get(String orgid, int id){}
我们通过浏览器来访问这个两个action,你会发现浏览器返回有多个action在的exception,
Multiple actions were found that match the request:
RouteBookDemo.Models.Employee Get(Int32, Int32) on type RouteBookDemo.Controllers.EmployeesController
RouteBookDemo.Models.Employee Get(System.String, Int32) on type RouteBookDemo.Controllers.EmployeesController
不知道访问哪一个action, 这说明一个问题,就是我们定义好route的匹配规则时,给其中的一个占位符约束好数据类型后,不管action里面的参数定义的是什么数据类型,都会匹配到。为了验证说明是正确的,我们debug一下看看orgid的类型。
这幅图片说明,当orgid的值是113的时候,匹配到controller里面的action 的时候int 类型的113,没有异议,我们再看第二幅图
这幅图的orgid的值还是113, 但是传递到action的时候,却变成了string的"113",现象已经很明显了,这里的占位符的数据类型最后是按照action去改变的,但是这个只是基本数据类型,换成我们自定义的数据类型会是什么样的呢?再看一副截图
这次返回了一个multiple actions 的exception,这次匹配的是get(employee,id)和get(id)的两个actions,奇怪的事情又发生了,为什么framework这次匹配到了2个actions 呢?同时也说明了,如果没有get(id)这个action,这个url也可能会匹配到get(employee,id)这个action,我们看看这里employee的传递的是什么值,看截图
这个时候113并没有发送到server端,此时的orgid的参数变成了null。
再看下面的一幅图,我们用get(int orgid,int id)和get(id)去debug,又有什么情况发生了?
此时framework匹配到了有orgid的action。
我们再看看route template里面的最后一个{Id},我们观察到所有的action里面,如果是按照Id去get的话,都是参数名称必须是ID,我们设想一下,如果我们想按照Id是get,但是吧id换成ff,会有什么情况呢?
URL 是http://localhost:2643/api/1/employees/12345
你会发现,没有走get(orgid,ff)的方法,虽然那个ff是int型的
现在我们来总结一下上面的图和现象:
1.在route的时候,首先是按照所有的参数去匹配,不管这个参数的是什么类型的。(基本数据类型,int,string 等,自定义的类,会是null,看上面的截图)
2.在action里面的参数,必须和route template里面的占位符是一样的,id就是id,在action里面换成其他的,url就匹配不到了
3.URL 里面的参数会在action里面发生数据类型的转换
.net web api 的route理解的更多相关文章
- 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(4)
chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angula ...
- 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(3)
chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angula ...
- 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(2)
chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angula ...
- 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(1)
chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angula ...
- Web Api通过Route、RoutePrefix等特性设置路由
[Route("customers/{customerId}/orders")] [HttpGet] public IEnumerable<Order> FindOrd ...
- web api token验证理解
最近一直在学习web api authentication,以Jwt为例,可以这样理解,token是身份证,用户名和密码是户口本,身份证是有有效期的(jwt 有过期时间),且携带方便(自己带有所有信息 ...
- Web API与AJAX:理解FormBody和 FormUri的WebAPI中的属性
这是这一系列文章"与 AJAX 的 Web API".在这一系列我们都解释消耗 Web API rest 风格的服务使用 jQuery ajax() 和其他方法的各种方法.您可以阅 ...
- 对一个前端AngularJS,后端OData,ASP.NET Web API案例的理解
依然chsakell,他写了一篇前端AngularJS,后端OData,ASP.NET Web API的Demo,关于OData在ASP.NET Web API中的正删改查没有什么特别之处,但在前端调 ...
- 购物车Demo,前端使用AngularJS,后端使用ASP.NET Web API(2)--前端,以及前后端Session
原文:购物车Demo,前端使用AngularJS,后端使用ASP.NET Web API(2)--前端,以及前后端Session chsakell分享了前端使用AngularJS,后端使用ASP.NE ...
随机推荐
- 2016最新一元云购完整源码 云购CMS系统 带安卓和ios手机客户端 源码免费分享
原文转自:http://www.zccode.com/thread-724-1-1.html 该资源说明: 看起来不错的一套一元云购CMS源码,源码包里面带了安卓和ios手机客户端,手机客户端需要自己 ...
- V9 二次开发技术篇之 模型数据库
应V9粉丝的建议,本人今天讲一下 MVC中的M 数据库模型 首先 在 phpcms\model 建一个模型文件test_model.class.php <?phpdefined('IN_PHP ...
- Hibernate中get方法和load方法的区别
一.get和load方法都是根据id去获得对应数据的,但是获得机制不同:如果使用get方法,hibernate会去确认该id对应的数据是否存在,它首先会去session中去查询(session缓存其实 ...
- uva10003 Cutting Sticks
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- Iterator pattern(c++实现)
概述: 在现在的电视机中,我们使用[后一个]和[前一个]按钮可以很方便的换台,当按下[后一个]按钮时,将切换到下一个预置的频道.想象一下在陌生的城市中的旅店中看电视.当改变频道时,重要的不是几频道,而 ...
- 开发自定义View
当开发者打算派生自己的UI组件时,首先定义一个继承View基类的子类,然后重写View类的一个或多个方法,通常可以被用户重写的方法如下:构造器:重写构造器是定制View的最基本方法,当Java代码创建 ...
- Stack Overflow requires external JavaScript from another domain, which is blocked or failed to load.
出现以上问题,只是说明stackoverflow前端库用到google的API来,所以stackoverflow躺枪.查阅后,是因为调用jquery的问题. 详情请看: 解决方案有好几种: 1.将ht ...
- oschina服务器软件
服务器软件 74Apache模块 54Nginx扩展模块 13Radius相关 94PaaS 系统 29服务发现/注册和协调 17Docker 扩展 7Docker 映像 83应用服务器 189HTT ...
- c语言内存模型
文章一.C语言的内存分配模型 1.程序代码区:存放函数体的二进制代码. 2.全局区数据区:全局数据区划分为三个区域.全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化 ...
- HDU_2050——折线分割平面问题,递推
Problem Description 我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可以将平面 ...