• ASP.NET MVC4学习笔记路由系统实现


    一.路由实现

      路由系统实际是一个实现了ASP.NET IHttpModule接口的模块,通过注册HttpApplication的PostResolveRequestCache 事件对Url路由处理.总体框架代码如下所示:

      foreach(路由规则 in 路由表)

      {

        if (当前路由规则匹配请求Url)

        {

          1.获取路由处理IRouteHandler

          2.从RouteHandler中获取HttpHandler 处理请求

        }

      }

      路由系统实现分为两个部分,一个是ASP.NET标准的模块,在System. Web.dll 程序集System.Web.Routing命名空间下,另一部分是针对ASP.NET MVC的扩展,实现在System.Web.MVC.dll 程序集System.Web.MVC命名空间下的路由扩展。标准模块中实现了页面路由注册(对应路由处理为PageRouteHandler, Page),ASP.NET MVC扩展实现了Controller路由注册(对应路由处理为MvcRouteHandler,MvcHandler).

         路由规则匹配过程描述如下:

      1. 检查请求Url与当前的路由模式是否匹配,如果匹配进入下一步,否则返回null

      2. 检查请求Url的每个段是否都满足约束,如果都满足,进入下一步,否则返回null

      3. 收集当前路由数据,并返回

      具本的路由模式检查由一个内部类ParsedRoute实现,这里就不展开说了,有兴趣的童鞋可Refector相关代码

     二.路径生成

      UrlHelper.Action和HtmlHelper.ActionLink生成的url 算法差不多,最终都会调用RouteCollection的GetVirtualPath()方法遍历路由表生成url

      UrlHelper.RouteUrl和HtmlHelper.RouteLink 是指定特定的路由名生成Url ,建议使用这一对方法,除了性能优势,指定路由名称指定特定的路由模式出错的可能性更小

         以上生成url的方法如果传递了协议名或主机名,则生成全路径的url

     三.区域路由实现

      首先尝试从缓存的MVC-AreaRegistrationTypeCache.xml获取区域路由注册类型列表,如果未获取到,通过反射从当前引用的程序集中获取所有的实现了AreaRegistration抽象类的类型,实例化每个AreaRegistration类型,创建区域路由上下文AreaRegistrationContext并调用AreaRegistration实例的RegisterArea方法实现区域路由注册.

      

  • 相关阅读:
    【javascript基础】JS计算字符串所占字节数
    mysql设置有外键的主键自增及其他
    spring AOP简单实现代码存放
    Dockerfile指令及docker的常用命令
    ubuntu 16.04 jenkins pipline的实现 最终docker启动服务
    ubuntu16.04 docker安装
    ubuntu16.04 nginx安装
    ubuntu14.04 spring cloud config server + gradle搭建
    ubuntu14.04 python2.7安装MySQLdb
    flask初次搭建rest服务笔记
  • 原文地址:https://www.cnblogs.com/jjyjjyjjy/p/3595184.html
Copyright © 2020-2023  润新知