.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 ...
随机推荐
- 如何往IE工具条添加按钮(转载)
如何往IE工具条添加按钮 问题提出:金山词霸.网络蚂蚁等软件安装后会向IE的工具条添加自己的按钮.按下按钮后还会作出相应的动作,这种功能是如何实现的呢?读完本文,您也可以将自己应用程序的按钮添加到IE ...
- Java中实现线程的方法
Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用? 第一种:继承Thread类 new Thread(){}.start();这表示调 ...
- Java导入证书失败Keystore was tampered with, or password was incorrect
keytool 错误: java.io.IOException: Keystore was tampered with, or password was incorrect 在进行证书相关操作, ...
- SQL语句中output的用法
在SQL语句中,output可以作为返回值来使用, 1.我们先看这个存储过程 代码: 1 set ANSI_NULLS ON 2 set QUOTED_IDENTIFIER ON 3 go 4 ...
- 遍历元素绑定事件时作用域是怎么回事啊,为什么要用this关键字,而直接使用元素本身就不行?
如下代码,将this改为rows[i]为啥不起作用了 var rows = document.getElementsByTagName("tr"); for(var i=0;i&l ...
- Swift—Cocoa错误处理模式-备
Swift错误处理模式,在Swift1.x和Swift 2.0是不同的两种模式. Swift 1.x代码错误处理模式采用Cocoa框架错误处理模式,到现在Objective-C还沿用这种处理模式,而S ...
- 采访:Go语言编程
Go语言是由Google在2009年11月份公布的,它的目标是要应对软件开发所面临的最新挑战.Go语言特别被设计为快速(包括在编译时).支持多核的语言,并且兼顾了动态语言的简单性和静态类型语言的安全性 ...
- C#控制生成图片的大小
private void button1_Click(object sender, EventArgs e) { using (Bitmap bitmap = new Bitmap("d:\ ...
- 【转】BT5无法找到软件安装包(提供可用的BT更新源)
像我这种一般想起才玩玩BT5的人,跟不上讯息的变化. 偶尔想尝试某个实验,然后去安装,发现提示无法找到软件安装包. 这个时候,应该注意到,现在已经从BT5到kali了,假如想我这种人,肯定比较少留意软 ...
- 使用python程序监控云服务器的带宽
将一些不重要的服务迁移到云服务上,有些下载什么的,为了防止带宽超了,python做了一个监控程序.用python3写的,由于和python2有些区别,特记录下来备查. 代码如下: #this is f ...