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方法实现区域路由注册.
ASP.NET MVC4学习笔记路由系统实现的更多相关文章
- ASP.NET MVC4学习笔记路由系统概念与应用篇
一.概念 1.路由是计算机网络中的一个技术概念,表示把数据包从一个网段转发至另一网段.ASP.NET中的路由系统作用类似,其作用是把请求Url映射到相应的"资源"上,资源可以是一段 ...
- asp.net mvc4 学习笔记一(基本原理)
做了8年的asp.net webform,用过MVVM但还没用过MVC , 虽然项目不用MVC,但是还是想了解一下,今天第二天学习,以下是学习心得. VS2012默认带有asp.net mvc3和as ...
- ASP.NET MVC4学习笔记之Controller的激活
一. 高层相关类说明 当路由系统根据请求Url收集路由信息后,下一步就要将路由信息传给Controller激活系统,Controller激活系统负责实现了IController接口的Controlle ...
- ASP.NET MVC4学习笔记之Controller激活的扩展
一. 为什么要进行扩展 在前面的分析中,我们知道默认的Controller激活系统只能实例化无参构造函数的Controller类型,但在某些情况一下,我们希望某些服务的实例能够自动注入到Control ...
- ASP.NET MVC4学习笔记之总体概述
断断续续使用ASP.NET MVC框架也有一年多了,也算积累了一些经验,唉,一直想写一些笔记好好总结一下,人太懒不想动笔,今天终于决定开始.希望自己能坚持下去. 这篇文章大体介绍ASP.NET MVC ...
- ASP.NET MVC4学习笔记
一.MVC简介
- Asp.net core (学习笔记 路由和语言 route & language)
https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing?view=aspnetcore-2.1 https://doc ...
- 路由其实也可以很简单-------Asp.net WebAPI学习笔记(一) ASP.NET WebApi技术从入门到实战演练 C#面向服务WebService从入门到精通 DataTable与List<T>相互转换
路由其实也可以很简单-------Asp.net WebAPI学习笔记(一) MVC也好,WebAPI也好,据我所知,有部分人是因为复杂的路由,而不想去学的.曾经见过一位程序猿,在他MVC程序中, ...
- Symfony2 学习笔记之系统路由
mfony2 学习笔记之系统路由 漂亮的URL绝对是一个严肃的web应用程序必须做到的,这种方式使index.php?article_id=57这类的丑陋URL被隐藏,由更受欢迎的像 /read/ ...
随机推荐
- Altium designer 原理图库快速创建
Altium designer 原理图库快速创建,原来都没发现用这个功能,最近查了一下很好用,就是通过Excel编写管脚名称再直接导入就可以了,很方便的. 1.首先在Excel创建填好对应管脚名称. ...
- NFS挂载启动
NFS挂载启动参数: 1.服务器IP.目录(虚拟机IP和 NFS目录) 2.开发的IP 如下我的开发板设置 ipaddr=192.168.1.17 ① 开发板IP serverip ...
- x86_64平台编译链接汇编程序
assemble: nasm -f elf32 sample.asm -l sample.lst link: ld -m elf_i386 -o test sample.o io.o
- Java GUI 画点
import java.awt.EventQueue; public class Paint { private JFrame frame; /** * Launch the application. ...
- 学习练习 java 线程
package com.hanqi.xc; import java.util.*; public class lianxi extends Thread { public void run() { c ...
- 递归遍历XML节点属性和属性值
public static XmlDocument FileMergedIntoXML(string strXmlPathPublic) { string strXmlPathPublic = str ...
- ionic icons and splash
ionic 用cordova 可以直接设置自己的icons ,不用修改默认的图片了 1.在自己的根目录下新建一个文件夹 如icons 2.然后在icons文件夹下再建一个iOS 文件夹存放所需要的图 ...
- Linkedlist,arrayDeque,HashMap,linkedHashMap
Linkedlist 1.extneds AbstractSequentialList, implements List<E>, Deque<E>, Cloneable, ja ...
- myeclipse上SVN代码合并详细步骤图解
1. 在装有svn插件的myeclipse中,在主干上选择需要合并的文件或文件夹 右击 -> 合并(merge) 2. 选择合并类型--合并两个不同的树 Merge -> Next 3. ...
- Sqlserver替换函数Replace
Sqlserver中Replace函数:实现字段中某个字符串批量替换. 注意:强烈建议替换前备份数据库以免发生灾难性后果. update article set [Content]=replace([ ...