zoukankan      html  css  js  c++  java
  • .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里面发生数据类型的转换

  • 相关阅读:
    分布式服务之CAP定理
    VUE启动报错
    码云管理项目
    推广项目之日志打印
    asp.net mvc中使用jquery H5省市县三级地区选择控件
    asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发4- 后台模板html页面创建
    asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发2-Model层建立
    asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发3-登录模块开发
    asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发1-准备工作
    asp.net mvc下实现微信公众号(JsApi)支付介绍
  • 原文地址:https://www.cnblogs.com/heavenStrone/p/heavenliu.html
Copyright © 2011-2022 走看看