MVC路由解析---IgnoreRoute

 

文章引导

MVC路由解析---IgnoreRoute

MVC路由解析---MapRoute

MVC路由解析---UrlRoutingModule

Area的使用

Area--->AreaRegister.RegisterAllArea()与Area区域的解析(一)

引言

Reflector源码反编译工具软件是必备

一.由路由注册开始

严格的说Route不只属于MVC,MVC所有的请求都是通过路由规则去映射的,所以MVC的头等大事就是路由规则的注册。规则的注册时在Global.asax的Application_Start事件里注册,以下是默认的路由注册代码

 

我们这篇文章的讲述内容以routes.IgnoreRoute("{resource}.axd/{*pathInfo}")深入学习

二.Application_Start的传参

IgnoreRoute的方法参数传入是由Application_Start的RouteConfig.RegisterRoutes(RouteTable.Routes)传入。但是RouteConfig类中RegisterRoutes的参数却为RouteCollection,好吧,我们的工作开始了。我们先来看RouteTable有什么深处含义。

RouteTable源码:

RouteTable是一个单例模式(如果不知道这个模式的同学可以去学习一下设计模式),Routes是一个公共的静态属性,属性的类型是RouteCollection。这也是RouteConfig类中的RegisterRoutes的参数为RouteCollection的缘故。

总结:RouteTable只有一个职责,就是构建一个静态单例RouteCollection,RouteCollection是一个泛型类:Collection<RouteBase>。这个RouteCollection用来保存路由规则的集合。

三.RouteCollection的IgnoreRoute

废话不多说,上源码(这个时候就是Reflection的厉害之处了):

public class RouteCollection:Collection<RouteBase>
{
private Dictionary<string, RouteBase> _namedMap;
private ReaderWriterLock _rwLock; public RouteCollection()
{
_namedMap = new Dictionary<string, RouteBase>(StringComparer.OrdinalIgnoreCase);
_rwLock = new ReaderWriterLock();
} public void Ignore(string url)
{
Ignore(url, null);
}
public void Ignore(string url,object constraints)
{
if (url == null)
{
throw new ArgumentNullException("url");
}
IgnoreRouteInternal item = new IgnoreRouteInternal(url)
{
Constraints=new System.Web.Routing.RouteValueDictionary(constraints)
};
base.Add(item);
}
}

上源码中RouteCollection是一个泛型继承了RouteBase的集合类Collection。

四.IgnoreRouteInternal

为了更好的深入了解,我们继续深入下去,现在看下IgnoreRouteInternal:

    public sealed class IgnoreRouteInternal:Route
{
public IgnoreRouteInternal(string url):base(url,new StopRoutingHandler())
{ }
}

可以看到,这是一个密封类,是不允许被继承的,但他却继承了Route,Route class是继承了RouteBase class。IgnoreRouteInternal有参构造函数调用的是Route的有参构造函数。

五.StopRoutingHandler

我们先来拆开StopRoutingHandler 看一下:

public class StopRoutingHandler:System.Web.Routing.IRouteHandler
{
IHttpHandler System.Web.Routing.IRouteHandler.GetHttpHandler(System.Web.Routing.RequestContext requestContext)
{
return this.GetHttpHandler(requestContext);
}
protected virtual IHttpHandler GetHttpHandler(System.Web.Routing.RequestContext req)
{
throw new NotSupportedException();
}
}

StopRoutingHandler是个特殊的RouteHandler对象,它的作用只是告诉UrlRouteModule,虽然某个规则匹配成功了,但是也还是当什么没有发生,说白了,我们需要去忽略一些规则。

我们来看一下一个如何被忽略的例子,阻止路由处理.axd文件的请求。

routes.Add(new Route("{resource}/.axd/{*pathInfo}",new StopRoutingHandler()));

六.IRouteHandler

打打鸡血,我们继续来拆解IRouteHandler

    //
// 摘要:
// 定义类必须实现才能处理匹配路由模式的请求的协定。
[TypeForwardedFrom("System.Web.Routing, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")]
public interface IRouteHandler
{
//
// 摘要:
// 提供处理请求的对象。
//
// 参数:
// requestContext:
// 一个对象,封装有关请求的信息。
//
// 返回结果:
// 一个处理请求的对象。
IHttpHandler GetHttpHandler(RequestContext requestContext);

IRouteHandler接口方法GetHttpHandler必须返回一个实现了IHttpHandler的信息,接受的参数类型为RequestContext,看到这个RequestContext,大家就会眼前一亮。这个是一个非常重要的点。

此处引入一位大神的Blog内容:深入解析路由系统架构原理 ----->https://www.cnblogs.com/Leo_wl/p/3380570.html

七.Route

我们回到第四步,public IgnoreRouteInternal(string url):base(url,new StopRoutingHandler())我们来看看Route的构造函数

public class Route:RouteBase
{
private string _url; public System.Web.Routing.IRouteHandler RouteHandler { get; set; }
public Route(string url,System.Web.Routing.IRouteHandler routeHandler)
{
this._url = url;
RouteHandler = routeHandler;
} public System.Web.Routing.RouteValueDictionary Constraints { get; set; }
}

八.base.Add(item)

RouteCollection是一个集合类,默认集合,将IgnoreRouteInternal放入集合。

思维导图:

System.Web.dll文件反编译后的源码:System.Web.dll

MVC路由解析---IgnoreRoute的更多相关文章

  1. MVC路由解析---MapRoute

    文章引导 MVC路由解析---IgnoreRoute MVC路由解析---MapRoute MVC路由解析---UrlRoutingModule Area的使用 引言 前面我们讲了IgnoreRout ...

  2. MVC路由解析---UrlRoutingModule

    文章引导 MVC路由解析---IgnoreRoute MVC路由解析---MapRoute MVC路由解析---UrlRoutingModule Area的使用 引言: 此文全文内容90%转自 一.前 ...

  3. AspNet Mvc 路由解析中添加.html 等后缀 出现404错误的解决办法

    使用Mvc 有时候我们希望,浏览地址以.html .htm 等后缀名进行结尾. 于是我们就在RouteConfig 中修改路由配置信息,修改后的代码如下 routes.IgnoreRoute(&quo ...

  4. ASP.NET MVC路由解析

    继续往下看<ASP.NET MVC5框架揭秘>. ASP.NET系统通过注册路由和现有的物理文件路径发生映射.而对于ASP.NET MVC来说,请求的是某个Controller中的具体的A ...

  5. 在ASP.NET非MVC环境中(WebForm中)构造MVC的URL参数,以及如何根据URL解析出匹配到MVC路由的Controller和Action

    目前项目中有个需求,需要在WebForm中去构造MVC的URL信息,这里写了一个帮助类可以在ASP.NET非MVC环境中(WebForm中)构造MVC的URL信息,主要就是借助当前Http上下文去构造 ...

  6. 2016/5/6 thinkphp ①框架 ② 框架项目部署 ③MVC模式 ④控制器访问及路由解析 ⑤开发和生产模式 ⑥控制器和对应方法创建 ⑦视图模板文件创建 ⑧url地址大小写设置 ⑨空操作空控制器 ⑩项目分组

    真实项目开发步骤: 多人同时开发项目,协作开发项目.分工合理.效率有提高(代码风格不一样.分工不好) 测试阶段 上线运行 对项目进行维护.修改.升级(单个人维护项目,十分困难,代码风格不一样) 项目稳 ...

  7. ASP.NET MVC 路由(一)

    ASP.NET MVC路由(一) 前言 从这一章开始,我们即将进入MVC的世界,在学习MVC的过程中在网上搜索了一下,资料还是蛮多的,只不过对于我这样的初学者来看还是有点难度,自己就想看到有一篇引导性 ...

  8. MVC路由配置

    目录 URL Routing 的定义方式 示例准备 给片段变量定义默认值 定义静态片段 自定义片段变量 自定义片段变量的定义和取值 将自定义片段变量作为Action方法的参数 指定自定义片段变量为可选 ...

  9. ASP.NET 路由解析

    这段时间在读园子里Artech大神的<ASP.NET MVC5框架揭秘>,慢慢地从底层了解了MVC模式的设计思路.下面是一些阅读的总结. 传统的Web Forms应用,URL指向的是具体的 ...

随机推荐

  1. Python 学习笔记18 异常处理

    我们在编码的过程中,难免会遇到一些错误和异常, 这时候程序会异常退出,并且会抛出错误信息: 比如: print(1/0) ''' 输出: Traceback (most recent call las ...

  2. java序列化的相关介绍

    1.什么是序列化?为什么要用序列化? 序列化就是将对象状态转换为可保持或传输的格式的过程.与序列化相对的就是反序列化,他将流转换成对象.这两个过程结合起来,可以轻松地存储和传输数据. 注意:对象序列化 ...

  3. Node总结

    一. 基本概念 1.1 DOM DOM(Document Object Model), 把网页转换成JS对象,可以用脚本进行各种操作.浏览器将结构化文档(HTML/XML)解析成一系列的节点形成DOM ...

  4. Codeforces 1172B(组合数学)

    题面 给出一棵n个点的树,要求把它画在圆上,且边不相交,画法与排列一一对应(即旋转后相同的算不同种),求方案数.如下图是4个点的树\(T:V=\{1,2,3,4\},E=\{(1,2),(1,3),( ...

  5. BZOJ 1912(树的直径+LCA)

    题面 传送门 分析 显然,如果不加边,每条边都要走2次,总答案为2(n-1) 考虑k=1的朴素情况: 加一条边(a,b),这条边和树上a->b的路径形成一个环,这个环上的边只需要走一遍,所以答案 ...

  6. BZOJ 4821 (luogu 3707)(全网最简洁的代码实现之一)

    题面 传送门 分析 计算的部分其他博客已经写的很清楚了,本博客主要提供一个简洁的实现方法 尤其是pushdown函数写得很简洁 代码 #include<iostream> #include ...

  7. CodeChef Gcd Queries

    Gcd Queries   Problem code: GCDQ   Submit All Submissions   All submissions for this problem are ava ...

  8. qt 如何注册自定义类型?

    如何声明自定义类型 如果仅仅在 QVariant 中使用,则仅需要使用 Q_DECLARE_METATYPE 宏进行声明即可. class Custom_ : public QObject { Q_O ...

  9. 【转】Linux下vim的基本操作

    原文链接 Linux vi/vim 所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 但是目前我们使用比较多的是 vim 编辑器. vim 具有程序编辑的能 ...

  10. go web编程——session管理机制设计与实现

    原生Go语言没有实现session管理机制,所以如果使用原生Go语言进行web编程,我们需要自己进行session管理机制的设计与实现,本文将就此进行详细介绍,并实现一个简单的session管理机制. ...