• 我相信“交警雨中护送高考生”是真,“交警雨中护送高考生”反被该高考生家长投诉是假。 2019-04-16
  • 14名消防员日巡逻28公里 洗冷水澡 2019-04-10
  • 靶壕有了“蓝军”,百发百中的“神枪手”练起来 2019-04-10
  • 不是秀强大了,别人就会来做朋友,这逻辑不对 2019-04-01
  • 候选企业:中国石油呼和浩特石化公司 2019-03-26
  • 航天员沙漠野外生存训练完美收官!为第一天团打call 2019-03-25
  • 请问,建立市场经济后,原计划经济哪里去?改革后,我们还在实行计划经济,为何没有提及? 2019-03-25
  • 构建年轻干部梯次培养链 2019-03-19
  • 孙实的专栏作者中国国家地理网 2019-03-15
  • 湖南师范大学举行研究阐释党的十九大精神国家社科基金重大专项学术研讨会 2019-03-15
  • [雷人]蠢货!土地处于不同的城市和地段,关联的资源不一样,价值也不一样。不然给咱俩同样面积的土地,咱的在北上广深,你的在边远山区,你干么? 2019-03-08
  • 国际社会持续热议上合青岛峰会:上合组织发展进入新阶段 彰显中国领导力 2019-03-08
  • 珍惜野生动物频现甘孜境内 生态环境质量不断提升 2019-03-06
  • "新经济形势下金融创新的变革与机遇"论坛 2019-03-06
  • 频道栏目
    神奇公式秒杀全国11选5 > 网络 > 路由器 > 正文
    MVC路由深入详解步骤一
    2018-06-26 09:10:26           
    收藏   我要投稿

    一.由路由注册开始

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

     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 }
                 );
             }
         }

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

    二.Application_Start的传参

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

    RouteTable源码

     private static RouteCollection _instance;
              static RouteTable()
              {
                 _instance = new RouteCollection();
              }
      
              public static RouteCollection Routes
              {
                  get { return _instance; }
             }

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

    三.RouteCollection的IgnoreRoute

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

    public class RouteCollection:Collection
        {
            private Dictionary _namedMap;
            private ReaderWriterLock _rwLock;
    
            public RouteCollection()
            {
                _namedMap = new Dictionary(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

    神奇公式秒杀全国11选5 www.2zfa.com 为了更好的深入了解,我们继续深入下去,现在看下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,大家就会眼前一亮。这个是一个非常重要的点。

    七.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放入集合。

    思维导图:

    点击复制链接 与好友分享!回本站首页
    上一篇:h3c设备做路由,sftp时报Couldn't read packet: Connection reset by peer错误的一种解决办法
    下一篇:无线路由的基本设置
    相关文章
    图文推荐
    点击排行

    关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 神奇公式秒杀全国11选5

    版权所有: 神奇公式秒杀全国11选5--致力于做实用的IT技术学习网站

  • 我相信“交警雨中护送高考生”是真,“交警雨中护送高考生”反被该高考生家长投诉是假。 2019-04-16
  • 14名消防员日巡逻28公里 洗冷水澡 2019-04-10
  • 靶壕有了“蓝军”,百发百中的“神枪手”练起来 2019-04-10
  • 不是秀强大了,别人就会来做朋友,这逻辑不对 2019-04-01
  • 候选企业:中国石油呼和浩特石化公司 2019-03-26
  • 航天员沙漠野外生存训练完美收官!为第一天团打call 2019-03-25
  • 请问,建立市场经济后,原计划经济哪里去?改革后,我们还在实行计划经济,为何没有提及? 2019-03-25
  • 构建年轻干部梯次培养链 2019-03-19
  • 孙实的专栏作者中国国家地理网 2019-03-15
  • 湖南师范大学举行研究阐释党的十九大精神国家社科基金重大专项学术研讨会 2019-03-15
  • [雷人]蠢货!土地处于不同的城市和地段,关联的资源不一样,价值也不一样。不然给咱俩同样面积的土地,咱的在北上广深,你的在边远山区,你干么? 2019-03-08
  • 国际社会持续热议上合青岛峰会:上合组织发展进入新阶段 彰显中国领导力 2019-03-08
  • 珍惜野生动物频现甘孜境内 生态环境质量不断提升 2019-03-06
  • "新经济形势下金融创新的变革与机遇"论坛 2019-03-06