MVC路由解析---UrlRoutingModule
文章引导
引言:
此文全文内容90%转自
一.前言
在MVC中,一个请求对应一个Controller的Action,熟悉asp.net的人应该知道,asp.net请求实际交给了HttpHandler进行了处理,HttpHandler就是ASP.NET的处理器。MVC的Action,请求都会交给HttpHandler。具体是在管道事件中,会根据请求创建一个HttpHandler,执行HttpHandler的ProcessRequest方法。
二.UrlRoutingModule
MVC的路由机制是通过一个UrlRoutingModule完成的,它是一个实现了IHttpModule的类,HttpModule通过注册HttpApplication事件参与到管道处理请求中。具体是订阅HttpApplication某个阶段的事件。废话不多说,上源码
public class UrlRoutingModule:IHttpModule
{
public RouteCollection _routeCollection; protected virtual void Init(HttpApplication application)
{
application.PostResolveRequestCache+=OnApplicationPostResolveRequestCache;
} void OnApplicationPostResolveRequestCache(object sender,EventArgs e)
{
HttpApplication app=(HttpApplication)sender;
HttpContextBase context=new HttpContextWrapper(app.Context);
PostResolveRequestCache(context);
} public virtual void PostResolveRequestCache(HttpContextBase context)
{
RouteData routeData=RouteCollection.GetRouteData(context); IRouteHandler routeHandler=routeData.RouteHandler; RequestContext requestContext=new RequestContext(context,routeData);
context.Request.RequestContext=requestContext; IHttpHandler httpHandler=routeHandler.GetHttpHandler(requestContext);
context.RemapHandler(httpHandler);
}
}
我们看看UrlRoutingModule的路线图
Route.GetRouteData:
public override RouteData GetRouteData(HttpContextBase httpContext)
{
//AppRelativeCurrentExecutionFilePath:获取应用程序的虚拟路径,并通过对应用程序根使用波形符(~)表示法,(例:~/page.aspx)使该路径成为相对路径。
//HttpRequest.PathInfo:获取扩展名的附加信息,例:对于 URL Http://www.contoso.com/virdir/page.html/tail,PathInfo 值为 /tail。
string requestPath=httpContext.Request.AppRelativeCurrentExecutionFilePath.SubString()+httpContext.Request.PathInfo; RouteValueDictionary values=_parseRoute.Match(requestPath,Defaults); RouteData routeData=new RouteData(this,RouteHanlder); foreach(var item in values)
{
routeData.Values.Add(item.Key,value.Value);
} //DataTokens
}
GetRouteData通过HttpContext来获取路由信息,形成RouteData,将URL与Defaults的Key进行匹配,形成RouteValueDictionary ,我们看看RouteData内部信息
属性:Route--->RouteData有参构造函数的参数Route
RouteHandler--->RouteData有参构造函数的参数IRouteHandler
方法:GetRouteData---->return RouteData
GetRequiredString---->string
上述的RouteHandler由Route的构造函数参数传入, 这里的Route来自于
MVC路由解析---UrlRoutingModule的更多相关文章
- MVC路由解析---IgnoreRoute
MVC路由解析---IgnoreRoute 文章引导 MVC路由解析---IgnoreRoute MVC路由解析---MapRoute MVC路由解析---UrlRoutingModule Are ...
- MVC路由解析---MapRoute
文章引导 MVC路由解析---IgnoreRoute MVC路由解析---MapRoute MVC路由解析---UrlRoutingModule Area的使用 引言 前面我们讲了IgnoreRout ...
- AspNet Mvc 路由解析中添加.html 等后缀 出现404错误的解决办法
使用Mvc 有时候我们希望,浏览地址以.html .htm 等后缀名进行结尾. 于是我们就在RouteConfig 中修改路由配置信息,修改后的代码如下 routes.IgnoreRoute(&quo ...
- ASP.NET MVC路由解析
继续往下看<ASP.NET MVC5框架揭秘>. ASP.NET系统通过注册路由和现有的物理文件路径发生映射.而对于ASP.NET MVC来说,请求的是某个Controller中的具体的A ...
- ASP.NET 路由解析
这段时间在读园子里Artech大神的<ASP.NET MVC5框架揭秘>,慢慢地从底层了解了MVC模式的设计思路.下面是一些阅读的总结. 传统的Web Forms应用,URL指向的是具体的 ...
- 在ASP.NET非MVC环境中(WebForm中)构造MVC的URL参数,以及如何根据URL解析出匹配到MVC路由的Controller和Action
目前项目中有个需求,需要在WebForm中去构造MVC的URL信息,这里写了一个帮助类可以在ASP.NET非MVC环境中(WebForm中)构造MVC的URL信息,主要就是借助当前Http上下文去构造 ...
- 2016/5/6 thinkphp ①框架 ② 框架项目部署 ③MVC模式 ④控制器访问及路由解析 ⑤开发和生产模式 ⑥控制器和对应方法创建 ⑦视图模板文件创建 ⑧url地址大小写设置 ⑨空操作空控制器 ⑩项目分组
真实项目开发步骤: 多人同时开发项目,协作开发项目.分工合理.效率有提高(代码风格不一样.分工不好) 测试阶段 上线运行 对项目进行维护.修改.升级(单个人维护项目,十分困难,代码风格不一样) 项目稳 ...
- MVC路由配置
目录 URL Routing 的定义方式 示例准备 给片段变量定义默认值 定义静态片段 自定义片段变量 自定义片段变量的定义和取值 将自定义片段变量作为Action方法的参数 指定自定义片段变量为可选 ...
- MVC 路由
1.ASP.NET MVC框架中提供的URL路由机制能够使URL不必映射到应用程序的特定物理文件. 2.当用户访问基于MVC模式创建的网站时,只需要在浏览器地址栏里输入类似于下面的URL: http: ...
随机推荐
- LINUX shell脚本相关
调试脚本 测试脚本语法:bash -n file.sh 查看脚本每一步执行情况:bash -x file.sh 位置变量:$1,$2,... 特殊变量: %?:最后一个命令的执 ...
- win7系统 无线路由关闭了ssid广播 我手动设置了SSID和密码仍然连接不上
http://zhidao.baidu.com/link?url=KwDGWPc67avpj2OUPg5UqvtqE_80R80P3xzhNIRI1_X5WnSLG7PLEpybb4TnzDAYAB6 ...
- Python中的内置函数和匿名函数
1. 内置函数 print用法 def print(self, *args, sep=' ', end='\n', file=None): # known special case of print ...
- python-orm操作数据库
ORM 模型 ORM概念 对象关系映射 全称(Object Relational Mapping) 简称ORM 模式是一种为了解决面向对象与关系型数据库存在的互不匹配的现象的技术. 简单来说, ORM ...
- Spring Boot 支持 HTTPS 如此简单,So easy!
这里讲的是 Spring Boot 内嵌式 Server 打 jar 包运行的方式,打 WAR 包部署的就不存在要 Spring Boot 支持 HTTPS 了,需要去外部对应的 Server 配置. ...
- luoguP3258 [JLOI2014]松鼠的新家 题解(树上差分)
P3258 [JLOI2014]松鼠的新家 题目 树上差分:树上差分总结 #include<iostream> #include<cstdlib> #include<c ...
- 数组Array的十种使用方法
第一种方法 array toString () 将数组的元素全部转换为字符串; 第二种方法 array join ("这里是分隔符") 这种方法可以把数组的元素转换为字符串,并把分 ...
- MyEclipse2017搭建android开发环境
1 安装MyEclipse2017cli7; 2 准备安装ADT插件和 Android SDK 开发包;比如:ADT-24.0.2 android-sdk_r24.4.1-windows; 工具栏点击 ...
- java -jar 中文乱码
java -Dfile.encoding=utf-8 -jar demo.jar 添加编码即可
- go语言从例子开始之Example10.map(字典)
map 是 Go 内置关联数据类型(在一些其他的语言中称为哈希 或者字典 ) package main import "fmt" func main() { 要创建一个空 map, ...