这个东西,真搞不懂。看了网上的教程和文章,也不懂(也不清楚写那些文章的人自己是否真的懂)。只好靠自己一顿乱摸索。

好比说,下面这个路由:

//路由1
config.Routes.MapHttpRoute(
name: "SysApi",
routeTemplate: "api/SysManager/{action}/{id}",
defaults: new { controller = "SysManager", id = RouteParameter.Optional }
);

routeTemplate里面有个“SysManager”,从URI结构来看,可以猜出这大概是个Controller;

然后下面的defaults,开宗明义地写着:controller = “SysManager”。

按照我过往想当然的理解,defaults里的controller = “SysManager”,就是个默认值,当没有指明controller的时候,那么这个默认值可以顶上去。可有可无之物。就这么简单,没深想。

然而,真是可有可无吗?仔细咀嚼:没有指明controller的时候,这个默认值可以顶上去,也就是说,http://localhost/api/SysManager/GetUser/108 这个地址,其实也可以简化写成 http://localhost/api/GetUser/108,系统会自动帮我们解析成前面那个地址。事实证明,还真是这样。

然后再看这个路由,有点怪,为啥routeTemplate里面已经有个“SysManager”,defaults里还要来一个。通常好像应该这么写:

//路由2
config.Routes.MapHttpRoute(
name: "SysApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { controller = "SysManager", id = RouteParameter.Optional }
);

是的,默认路由都是2这种写法。而路由1是路由2的一个补充,多路由。路由1的含义其实是这样的:

对于 /api/SysManager/GetUser/108 这样的URI,系统会将其路由到控制器SysManager中去。为什么呢?在routeTemplate中的”SysManager”,只是一个普通的字符串而已,它并不是控制器(或者说,系统并不知道它代表着控制器)!由于这个URI没有指明controller,所以系统将其解析到默认控制器SysManager。所以说,routeTemplate中的”SysManager”跟defaults中的其实是两回事。

api/SysManager/{action}/{id} 并不等于 api/{controller}/{action}/{id} 

这一点,是我以前从未理解的。

只有写成{controller}这种占位符的形式,才是控制器。像{controller}、{action}是系统默认符号,它真的就代表了控制器和action。

另外,像{id}中的id,代表参数id。而且你真的要在方法中将参数写成id,比如:

    public class TestController : ApiController
{
// 可以这样访问: api/Test/5
public string Get(int id)
{
return "value";
} //这个方法只能这样访问:api/Test/?name=leftfist
public string Get(string name)
{
return "value";
}
}

之所以有以上一些感悟,是因为这两天在集成两个asp.net webapi项目。遇到了一个问题,就是项目A遵循RESTFul原则,地址都是没有action的,像这样:api/User/108;而项目B则有action,地址像这样:api/User/GetUser/108。现在将B集成到A后就有问题了,访问api/User/GetUser/108的时候,会提示”multiple get actions”之类的错误。

这就涉及到路由的问题。我是这样解决的:

//增强路由,满足多action
config.Routes.MapHttpRoute(
name: "SysApi",
routeTemplate: "api/SysManager/{action}/{id}",
defaults: new { controller = "SysManager", id = RouteParameter.Optional }
); //默认路由,满足RESTful原则
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);

对ASP.NET MVC 的路由一点理解的更多相关文章

  1. 理解ASP.NET MVC的路由系统

    引言 路由,正如其名,是决定消息经由何处被传递到何处的过程.也正如网络设备路由器Router一样,ASP.NET MVC框架处理请求URL的方式,同样依赖于一张预定义的路由表.以该路由表为转发依据,请 ...

  2. ASP.NET MVC 自定义路由中几个需要注意的小细节

    本文主要记录在ASP.NET MVC自定义路由时,一个需要注意的参数设置小细节. 举例来说,就是在访问 http://localhost/Home/About/arg1/arg2/arg3 这样的自定 ...

  3. 返璞归真 asp.net mvc (2) - 路由(System.Web.Routing)

    原文:返璞归真 asp.net mvc (2) - 路由(System.Web.Routing) [索引页] [源码下载] 返璞归真 asp.net mvc (2) - 路由(System.Web.R ...

  4. asp.net mvc 特性路由(MapMvcAttributeRoutes)的应用

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u012835032/article/details/51160824asp.net mvc 特性路由 ...

  5. asp.net MVC URL路由入门指南

    asp.net MVC 的URL路由是一个非常强大的功能,而且有个优点:强大单不复杂.然而,目前我在网上看到的相关资料,却都仅仅提供一些示例,仅通过这些示例,初学者基本上不可能明白为什么要这么配置,更 ...

  6. ASP.NET MVC 之 路由配置

    主要操作在App_Start 目录下的 RouteConfig.cs 文件. 一.Url构造方式 1.命名参数规范+匿名对象 routes.MapRoute( name: "Default& ...

  7. ASP.NET MVC的路由

    好久没写博文了,感觉最近好像少了点动力.唉!这回就看看这个MVC的路由. 说这个路由机制其实不是MVC里面特有的,ASP.NET里面本身就有的,只不过在WebForm里面一般比较少用,而在MVC里就是 ...

  8. Asp.net MVC中Route的理解

    在Asp.net MVC中,对于一个请求,是通过路由找到对应的Controller类中的对应Action,并与model进行交互,最后返回到view. 就是说Asp.net MVC是用Route来定义 ...

  9. ASP.NET MVC API 路由生成规则

    我们都知道调用ASP.NET MVC的某些API函数(诸如:Url.Action.RedirectToAction等)可以生成URL,ASP.NET MVC会根据调用API函数时传入的参数去匹配系统定 ...

随机推荐

  1. 大页(Huge Page)简单介绍

    x86(包括x86-32和x86-64)架构的CPU默认使用4KB大小的内存页面(getconf PAGESIZE),但是它们也支持较大的内存页,如x86-64系统就支持2MB大小的大页(huge p ...

  2. 如何用纯 CSS 创作一个冒着热气的咖啡杯

    效果预览 在线演示 按下右侧的"点击预览"按钮在当前页面预览,点击链接全屏预览. https://codepen.io/zhang-ou/pen/xjXxoz 可交互视频教程 此视 ...

  3. windows下安装oracle客户端和php扩展

    先来抱怨下 ,按这玩楞费了我大半天的时间,一路的坑! 我的电脑是win7 64位的 第一步  打开php.ini  把 extension=php_oci8_12c.dll extension=php ...

  4. linux 配置文件要不要加上#! /bin/bash

    现在一般的linux系统默认的shell都是bash.所以但很多unix系统可能会用bourne shell.csh或者ksh等来作为用户默认shell 如果你在写shell脚本的时候,用的语法只有b ...

  5. 大数据学习——ip改成固定ip

    vi /etc/sysconfig/network-scripts/ifcfg-eth0 修改BOOTPROTO为static 添加IPADDR=192.168.74.100 添加NETMASK=25 ...

  6. 大数据学习——linux常用命令(三)

    三 文件操作 1创建文件 touch somefile.txt 创建一个空文件somefile.txt > 重定向操作符 echo "woshiwoa"> some.t ...

  7. 收集整理Android开发所需的Android SDK、开发中用到的工具、Android开发教程、Android设计规范,免费的设计素材等。

    AndroidDevTools Android Dev Tools官网地址:www.androiddevtools.cn 收集整理Android开发所需的Android SDK.开发中用到的工具.An ...

  8. [NOIP2001] 提高组 洛谷P1027 Car的旅行路线

    题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个 矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I个城市中高速铁路了的单 ...

  9. 使用DataOutputStream输出流的read方法出现读取字节不一致解决办法,本地和测试环境不一致

    之前: DataInputStream in = new DataInputStream(connection.getInputStream());    byte[] b = new byte[in ...

  10. Flex4分模块下样式动态加载步骤及相关问题的解决

    1.  给应用程序编写CSS文件 (1)在项目下创建CSS文件(任意路径,可以多个).本例在src下创建了5个样式文件 (2)Flex支持的CSS文件定义如下: a)  type selector(类 ...