.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. javascript sort()与reverse()

    javascript 中提供了两个对数据进行排序的方法,即sort()和reverse() 在理解的时候犯了一个非常低级的错误,现记录如下: reverse()不包括排序的功能,只是把原来的数组反转. ...

  2. Backbone学习笔记

    model model的get和set是对model.attributes进行操作,并不是直接对model进行操作 collection collection.set()会触发相应的add,remov ...

  3. nginx配置使其支持thinkphp的pathinfo模式

    #user root;#user nobody;worker_processes 1; #error_log logs/error.log;#error_log logs/error.log noti ...

  4. string string.h=cstring=str

    <string.h> <string.h>是C版本的头文件,包含比如strcpy.strcat之类的字符串处理函数. <cstring> 在C++标准化(1998年 ...

  5. 搭建本地Nuget服务器并使用NuGet Package Explorer工具打包nuget包

    1.什么是Nuget: 百度百科描述: Nuget是 ASP .NET Gallery 的一员.NuGet 是免费.开源的包管理开发工具,专注于在 .NET 应用开发过程中,简单地合并第三方的组件库. ...

  6. Android监听事件

    ListView事件监听: setOnItemSelectedListener 鼠标滚动时触发 setOnItemClickListener 点击时触发 EditText事件监听: setOnKeyL ...

  7. 解决安装 Visual Studio 2012 后无法连接VPN的问题

    1. 单击“开始”,单击“运行”,键入“regedit”,然后单击“确定” 2. 找到下面的注册表子项,然后单击它: HKEY_LOCAL_MACHINE\System\CurrentControlS ...

  8. static在实例Extends、Overload中理解

    在写java程序的时候只在类内部调用的方法定义为private的是个很好的编程习惯.另外子类的static方法和父类有同名.同参数的static方法,但他们之间没什么覆盖.继承的关系,你调用的时候看是 ...

  9. LeetCode-Word LadderII

    Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) from ...

  10. C# 文件上传

     一.分析 本次博客,主要解决文件上传等一系列问题,将从两方面来论述,即1G以内文件和1G以上文件. 对于上传1G以内的文件,可以采用基本的三种上传方法:用Web控件FileUpload.html控件 ...