.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理解的更多相关文章

  1. 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(4)

    chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angula ...

  2. 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(3)

    chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angula ...

  3. 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(2)

    chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angula ...

  4. 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(1)

    chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angula ...

  5. Web Api通过Route、RoutePrefix等特性设置路由

    [Route("customers/{customerId}/orders")] [HttpGet] public IEnumerable<Order> FindOrd ...

  6. web api token验证理解

    最近一直在学习web api authentication,以Jwt为例,可以这样理解,token是身份证,用户名和密码是户口本,身份证是有有效期的(jwt 有过期时间),且携带方便(自己带有所有信息 ...

  7. Web API与AJAX:理解FormBody和 FormUri的WebAPI中的属性

    这是这一系列文章"与 AJAX 的 Web API".在这一系列我们都解释消耗 Web API rest 风格的服务使用 jQuery ajax() 和其他方法的各种方法.您可以阅 ...

  8. 对一个前端AngularJS,后端OData,ASP.NET Web API案例的理解

    依然chsakell,他写了一篇前端AngularJS,后端OData,ASP.NET Web API的Demo,关于OData在ASP.NET Web API中的正删改查没有什么特别之处,但在前端调 ...

  9. 购物车Demo,前端使用AngularJS,后端使用ASP.NET Web API(2)--前端,以及前后端Session

    原文:购物车Demo,前端使用AngularJS,后端使用ASP.NET Web API(2)--前端,以及前后端Session chsakell分享了前端使用AngularJS,后端使用ASP.NE ...

随机推荐

  1. Oracle数据库之PL/SQL过程与函数

    Oracle数据库之PL/SQL过程与函数 PL/SQL块分为匿名块与命名块,命名块又包含子程序.包和触发器. 过程和函数统称为PL/SQL子程序,我们可以将商业逻辑.企业规则写成过程或函数保存到数据 ...

  2. python 安装中的错误解决

    最近使用python3.5,其中遇到安装中的错误,现在记录下来,提个醒 1 安装setuptools 出现缺少 zlib模块 解决: 1 yum install zlib 2 yum install ...

  3. MOOTOOLS简单操作应用知识

    在项目中我们经常需要用到全选/反选.等操作按钮. 基于mootools框架与jquery框架不一致.导致缓慢. $('chkall').addEvent('click',function(){ if( ...

  4. WebSQL实例记录

    <table id="content"> </table> <br> <input type="button" id= ...

  5. cocos2d(粒子效果编辑器)

    ParticleDesigner  for  Mac下载地址:http://www.cocoachina.com/bbs/read.php?tid=108339 最近在做一款粒子编辑器 其实就是在co ...

  6. Core开发-后台任务利器Hangfire使用

    Core开发-后台任务利器Hangfire使用 ASP.NET Core开发系列之后台任务利器Hangfire 使用. Hangfire 是一款强大的.NET开源后台任务利器,无需Windows服务/ ...

  7. 【C#】委托与事件

    一.委托 1.概念:用来存放 方法 指针(地址)的容器. 为什么要有委托?当有的业务代码总体已经实现,但有部分需要调用者来决定,就可以使用委托的方式,让调用者把一段代码以 方法的方式 传入. [例子] ...

  8. Spring碎点知识

    1.依赖注入:不仅可以为Bean注入普通的属性值,还可以注入其他Bean的作用.通过配置文件组织在一起,这里的Bean是Java对象 说明:关于依赖注入与控制反转的这两个名字,表达的都是同一个意思,只 ...

  9. iOS网络编程-ASIHTTPRequest框架同步请求-备用

    在ASIHTTPRequest框架中与HTTP请求相关的类有:ASIHTTPRequest和ASIFormDataRequest,其中最常用的是ASIHTTPRequest,ASIFormDataRe ...

  10. Intel hex 文件格式解密

    Intel hex 文件常用来保存单片机或其他处理器的目标程序代码.它保存物理程序存储区中的目标代码映象.一般的编程器都支持这种格式. Intel hex 文件全部由可打印的ASCII字符组成(可以用 ...