框架自动生成的路由配置
上图中, 路由配置文件为 App_Start 文件夹下的 RouteConfig.cs
代码如下:
- public class RouteConfig
- {
- public static void RegisterRoutes(RouteCollection routes)
- {
- routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
- routes.MapRoute(
- name: "Default",
- url: "{controller}/{action}/{id}",
- defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
- );
- }
- }
注意: 路由中的控制器和操作不区分大小写
忽略路由
IgnoreRoute 为 RouteCollection 的扩展方法, 作用是忽略指定样式的路由
上面 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 中的 {resource} 代表一个路由参数,{resource}.axd 代表以. axd 结尾的字符串;{*pathInfo}也是一个路由参数,* 代表匹配任何字符串, 那么以 pathInfo 结尾的串都会匹配到这条语句完整含义是: 以 axd 结尾的任何字符串, 不论斜杠后是何种字符串都不执行路由行为
映射路由
MapRoute 也是 RouteCollection 的扩展方法, 映射路由
MapRoute 有多个重载的方法, 所有的参数含义如下:
参数名称 | 参数类型 | 注释 |
name | string | 路由名称 |
url | string | Url 模式 |
defaults | object | 默认路由值对象 |
constraints | object | 一组表达式,限定 URL 参数值 |
namespaces | string[] | 设置一组命名空间 |
参数解析
1)defaults 设置默认的路由值对象,
2)constraints: 通过正则表达式来设置约束条件
如 constraints:new {id=@"\d+"}限制 id 只能是数值类型
规则: 从前到后逐段匹配, 请求 URL 参数少于定义的 URL 时, 默认配置补全对应的参数
几个例子:
- routes.MapRoute(
- name:"",
- url:"V1/{controller}/{action}/{id}",
- defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
- constraints:new {id=@"\d+"}
- );
- 3)url
- {controller}/{action}/{id}
这种形式包括了三段, 段指的是路由中用 / 隔开的部分约定路由中的控制器和操作用 controller 和 action 表达
段也可以包含字面值
不允许有两个连续的段值:
例如
不允许:{controller}{action}/{id}
合法的:{language}-{current}/{controller}/{action}/{id}
多个路由的选择问题
当配置多个路由时, 从上到下依次匹配, 直至匹配到一个
匹配现有文件
通过设置 RouteCollection.RouteExistingFiles 属性来确定是否可以匹配到现有文件若, routes.RouteExistingFiles = false; 则, 禁止匹配到现有文件, 只能匹配路由表里的虚拟路由
例:
- public static void RegisterRoutes(RouteCollection routes)
- {
- routes.RouteExistingFiles = true;
- // 其他配置
- }
使用特性配置路由
将属性 RouteAttribute 标记到控制器或控制器操作上
- [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = false, AllowMultiple = true)]
- public sealed class RouteAttribute : Attribute, IDirectRouteFactory, IRouteInfoProvider
使用特性的三个属性或构造函数:
public RouteAttribute(string template):template 是路由匹配模式
Name: 获取或设置路由名称
Order: 获取或设置路由应用顺序
Template: 获取路由匹配模式
URL 与搜索引擎优化
1)URL 越短越好
2)用破折号而不是下划线
3)使用小写字母根据 HTTP 规范, URL 区分大小写, 一般的搜索引擎遵循 HTTP 规范
使用 Glimpse 观察路由
安装 Glimpse
地址 http://getglimpse.com/Docs/#download 找到所需安装命令在网站上可以看到不只应用于 MVC; 这里主要是使用这个工具观察路由, 所以下载 MVC 包
打开 VS->工具 ->NuGet 程序包管理器 ->程序包管理器控制台, 在控制台上输入命令: Install-Package Glimpse.MVC5, 然后回车, 执行安装, 结果如下:
启用 Glimpse
运行 web 应用, 输入地址格式为: 网站根目录 / glimpse.axd, 例如
http://localhost:51881/glimpse.axd, 显示界面如下, 点击 Turn Glimpse on 启动
使用 Glimpse 观察
启动了 Glimpse 以后, 输入 http://localhost:51881/Home/Contact, 看到下图
注意浏览器下方多了一条统计信息, 从这里可以看到路由请求的相关信息, 以上面输入的地址为例:
浏览器请求耗时
服务端响应耗时
点击下面的图标查看更加详细的信息
展示详细信息的界面如下所示:
从上图中可以看到配置, 运行环境, 模型绑定, 请求, 路由, 服务器, 时间统计等等
扩展路由 - 创建自定义路由约束
继承 IRouteConstraint 接口, 实现 Match 方法
- public class CustomRouteConstraint : IRouteConstraint
- {
- public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
- {
- // 实现验证
- // 验证通过返回 true
- return true;
- }
- }
使用约束
- routes.MapRoute(
- name:"CustomConstr",
- url:"{controller}/{action}/{id}",
- defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
- constraints:new {id=new CustomRouteConstraint()}
- );
原理
1)首先, UrlRouteModule 处理新请求, 将请求 URL 映射到定义的路由器上
2)若 URL 匹配到已定义的路由, 那么创建 IRouteHandler 实例(默认实例为 MvcRouteHandler 对象)
3)IRouteHandler 返回 HTTP 处理器实例(默认的为 MvcHandler),HTTP 处理器实例负责处理请求消息
4)HTTP 处理器实例使用 IControllerFactory(控制器工厂)创建对应的控制器对象
注意:
对于 1)如果请求的 URL 能够匹配到网站根目录下的实体文件, 那么不会再匹配虚拟路由, 除非通过 RouteCollection.RouteExistingFiles 来设置改变这一行为
参考:
1.Jess Chadwick/Todd Snyder/Hrusikesh Panda, 徐雷 / 徐扬
译 ASP.NET MVC4 Web 编程
2.Jon Galloway/Phil Haack/Brad Wilson/K. Scott Allen, 孙远帅 / 邹权译 ASP.NET MVC4 高级编程(第四版)
3. 黄保翕, ASP.NET MVC4 开发指南
4. 蒋金楠, ASP.NET MVC4 框架揭秘
- 5.https://www.asp.net/mvc
- -----------------------------------------------------------------------------------------
来源: https://www.cnblogs.com/hdwgxz/p/8640648.html