一.路由实现

  路由系统实际是一个实现了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方法实现区域路由注册.

  

ASP.NET MVC4学习笔记路由系统实现的更多相关文章

  1. ASP.NET MVC4学习笔记路由系统概念与应用篇

    一.概念 1.路由是计算机网络中的一个技术概念,表示把数据包从一个网段转发至另一网段.ASP.NET中的路由系统作用类似,其作用是把请求Url映射到相应的"资源"上,资源可以是一段 ...

  2. asp.net mvc4 学习笔记一(基本原理)

    做了8年的asp.net webform,用过MVVM但还没用过MVC , 虽然项目不用MVC,但是还是想了解一下,今天第二天学习,以下是学习心得. VS2012默认带有asp.net mvc3和as ...

  3. ASP.NET MVC4学习笔记之Controller的激活

    一. 高层相关类说明 当路由系统根据请求Url收集路由信息后,下一步就要将路由信息传给Controller激活系统,Controller激活系统负责实现了IController接口的Controlle ...

  4. ASP.NET MVC4学习笔记之Controller激活的扩展

    一. 为什么要进行扩展 在前面的分析中,我们知道默认的Controller激活系统只能实例化无参构造函数的Controller类型,但在某些情况一下,我们希望某些服务的实例能够自动注入到Control ...

  5. ASP.NET MVC4学习笔记之总体概述

    断断续续使用ASP.NET MVC框架也有一年多了,也算积累了一些经验,唉,一直想写一些笔记好好总结一下,人太懒不想动笔,今天终于决定开始.希望自己能坚持下去. 这篇文章大体介绍ASP.NET MVC ...

  6. ASP.NET MVC4学习笔记

    一.MVC简介

  7. Asp.net core (学习笔记 路由和语言 route & language)

    https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing?view=aspnetcore-2.1 https://doc ...

  8. 路由其实也可以很简单-------Asp.net WebAPI学习笔记(一) ASP.NET WebApi技术从入门到实战演练 C#面向服务WebService从入门到精通 DataTable与List<T>相互转换

    路由其实也可以很简单-------Asp.net WebAPI学习笔记(一)   MVC也好,WebAPI也好,据我所知,有部分人是因为复杂的路由,而不想去学的.曾经见过一位程序猿,在他MVC程序中, ...

  9. Symfony2 学习笔记之系统路由

    mfony2 学习笔记之系统路由   漂亮的URL绝对是一个严肃的web应用程序必须做到的,这种方式使index.php?article_id=57这类的丑陋URL被隐藏,由更受欢迎的像 /read/ ...

随机推荐

  1. @InitBinder

    类型转换: 请求url:  http://localhost:8080/SSHDemo2/stu/pro?s=zk,19 传入参数 s=zk,19   转换为Student public class ...

  2. linux内核调试指南

    linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 ***第一部分:基础知识*** 总纲:内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 ...

  3. 项目积累——Strus、Hibernate

    在Struts-config.xml中对ActionForm Bean的生命周期用scope进行定义,可用的选项有:pageContext(缺省).request(常用).session.applic ...

  4. sublime text编辑器删除已安装的插件

    1.ctr+shift+P,输入package2.查找remove package3.输入你要删除的package4.回车,OK

  5. 【LeetCode】11. Container With Most Water

    题目: Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, a ...

  6. 图形设备接口(GDI)

    图形设备接口(GDI,Graphics Device Interface)负责在显示器和打印机上显示图形.GDI 是由几百个函数和一些相关的数据类型.宏和结构构成的.Windows 98/NT 中的图 ...

  7. linux内核学习(一步一步走)——内核概述

    一.用户空间与内核空间: 用户通过用户空间与操作系统打交道,程序员开发或使用的应用程序位于用户空间.用户空间不能直接访问内核,从而不能访问硬件资源,但是可以通过内核定义的最外层例程——系统调用来访问. ...

  8. 调用robustfit函数作稳健回归

    调用robustfit函数作稳健回归 regress函数和regstats函数利用普通最小二乘法估计模型中的参数,参数的估计值受异常值的影响比较大.robustfit函数采用加权最小二乘法估计模型中的 ...

  9. TCP/IP详解学习笔记(15)-- TCP的流量控制和拥塞控制

    TCP的流量控制 1.概述      所谓的流量控制就是让发送方的发送速率不要太快,让接收方来得及接受.利用滑动窗口机制可以很方便的在TCP连接上实现对发送方的流量控制.TCP的窗口单位是字节,不是报 ...

  10. golang初体验

    使用golang开发已经有一个多月了,除了一开始遇到的各种小白问题,IDE的选择,gopath,goroot的配置...后边还算顺风顺水的.实践体验,golang真的适合快速开发.特别是后台开发,直接 ...