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. 《JAVA设计模式》之代理模式(Proxy)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述代理(Proxy)模式的: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 代理模式的结 ...

  2. Struts2之上传

    单文件上传 上传页面 <%@ page language="java" contentType="text/html; charset=UTF-8" pa ...

  3. LeetCode #657. Robot Return to Origin 机器人能否返回原点

    https://leetcode-cn.com/problems/robot-return-to-origin/ 设置 flagUD 记录机器人相对于原点在纵向上的最终位置 flagRL 记录机器人相 ...

  4. 【题解】Hankson 的趣味题

    题目大意 已知正整数$a_{0}$.$a_{1}$.$b_{0}$.$b_{1}$($1 \leq a_{0}, a_{1}, b_{0}, b_{1} \leq 2 \times 10^{9}$), ...

  5. 12、numpy——数学函数

    NumPy 数学函数 NumPy 包含大量的各种数学运算的函数,包括三角函数,算术运算的函数,复数处理函数等. 1.三角函数 NumPy 提供了标准的三角函数:sin().cos().tan(). i ...

  6. 【TWRP】使用adb sideload线刷ROM的方法

    本教程详细介绍 手机刷三方ROM 之前需要安装的 TWRP 这个神器工具 楼主的手机是小米,所以此教程以小米手机为例.其他手机原理类似 第一步,解锁引导程序 访问小米的官方解锁网站并申请解锁权限. 等 ...

  7. 76.Longest Consecutive Sequence(最长的连续序列)

    Level:   Hard 题目描述: Given an unsorted array of integers, find the length of the longest consecutive ...

  8. ES6——函数-箭头函数

    箭头函数: 1.普通函数 function 函数名(){...} 2.箭头函数 注意:  1)如果只有一个返回值,{}return可以省略: let arr = [12,5,8,99,33,14,26 ...

  9. NodeJs初相识

    一.nodeJs简介 1.Node 是一个服务器端 JavaScript 解释器. 2.Node 的目标是帮助程序员构建高度可伸缩的应用程序,编写能够处理数万条同时连接到一个物理机的连接代码.处理高并 ...

  10. Hibernate纯sql查询VO对象封装

    hibernate 纯sql查询返回结果集(未关联映射)组装VO的问题//须保证别名字段与Vo字段一致 //引号中为vo对象属性需与sql查询返回字段一致.addScalar("chname ...