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

最新文章

  1. Spring JdbcTemplate 调用存储过程
  2. 理解并使用.NET 4.5中的HttpClient
  3. ubuntu 安装遇到黑屏
  4. 滚动条滚动事件 js
  5. 日期工具类TimeUnit
  6. 如何获取app的素材,做出一个高仿的app
  7. Hadoop之HDFS原理及文件上传下载源码分析(下)
  8. [Swift]LeetCode503. 下一个更大元素 II | Next Greater Element II
  9. [Swift]LeetCode998. 最大二叉树 II | Maximum Binary Tree II
  10. Codeforces960G Bandit Blues 【斯特林数】【FFT】
  11. Win10远程桌面可能是由于CredSSP加密Oracle修正
  12. metasploit framework(五):meterpreter基本命令和python扩展
  13. Java 条件编译
  14. js关于a++ 与++a
  15. 解决 pycharm can not save setting
  16. 三维凸包求内部一点到表面的最近距离(HDU4266)
  17. IE6开发调试插件:IE Developer Toolbar
  18. 28.OGNL与ValueStack(VS)-总结$ # %的区别
  19. MongoDB中使用的SCRAM-SHA1认证机制
  20. Android屏幕尺寸单位转换

热门文章

  1. RMQ(连续相同最大值)
  2. 【接口工具】接口抓包工具之Charles
  3. Can&#39;t determine basedir from my_print_defaults mysqld
  4. mpvue中的 钩子函数
  5. 202-基于TI DSP TMS320C6678、Xilinx K7 FPGA XC72K325T的高速数据处理核心板
  6. vim常用快捷键及操作记录
  7. 在CNN上增加一层CAM告诉你CNN到底关注什么
  8. java下载文件demo
  9. python爬虫:2.每天爬取数据量是多少?
  10. java上传附件含有%处理或url含有%(URLDecoder: Illegal hex characters in escape (%) pattern - For input string)