【深入ASP.NET原理系列】--Asp.Net Mvc和Asp.Net WebForm共用一套ASP.NET请求管道
.NET FrameWork4在系统全局配置文件(如在如下目录中C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config)
中添加了一个名字叫UrlRoutingModule的HttpModule
通过反编译工具我们可以看见
UrlRoutingModule是在System.Web程序集下,并不是在Mvc程序集里面,本身在.NETFrameWork框架中就有这个路由类,同时实现IHttpModule接口,那么它肯定有个Init方法.
可以看到它往我们的请求application对象,也就是我们的请求管道的第7个事件(PostResolveRequestCache
)上注册了一个方法.如下
public virtual void PostResolveRequestCache(HttpContextBasecontext)
{
RouteData routeData= this.RouteCollection.GetRouteData(context);
if (routeData != null)
{
IRouteHandler routeHandler = routeData.RouteHandler;
if (routeHandler == null)
{
throw newInvalidOperationException(string.Format(CultureInfo.CurrentCulture,SR.GetString("UrlRoutingModule_NoRouteHandler"), new object[]));
}
if (!(routeHandler is StopRoutingHandler))
{
RequestContext requestContext = new RequestContext(context, routeData);
context.Request.RequestContext = requestContext;
IHttpHandler httpHandler = routeHandler.GetHttpHandler(requestContext);
if (httpHandler == null)
{
object[] args = new object[] {routeHandler.GetType() };
throw newInvalidOperationException(string.Format(CultureInfo.CurrentUICulture,SR.GetString("UrlRoutingModule_NoHttpHandler"), args));
}
if (httpHandler is UrlAuthFailureHandler)
{
if(!FormsAuthenticationModule.FormsAuthRequired)
{
throw newHttpException(0x191, SR.GetString("Assess_Denied_Description3"));
}
UrlAuthorizationModule.ReportUrlAuthorizationFailure(HttpContext.Current,this);
}
else
{
context.RemapHandler(httpHandler);
}
}
}
}
我们可以看到这个方法一开始就使用了静态路由表中的的数据,而这个静态路由表数据正是我们在Global.asax中的Application_Start中向静态路由表中注册的路由数据(Mvc网站在第一次运行就会执行Application_Start,这个时候就把路由数据注册到了这个RouteTable里面了)
ASPNET_ISAPI.dll中的HttpApplicationFactory类创建HttpApplication对象的时候,率先会去检查Application_Start是否被调用了,如果没被调用它就会去执行一次
接着获取Global文件里的类型作为网站的HttpApplication,每次返回一个HttpApplication类对象或者子类的对象,读取配置文件,创建系统配置文件及用户配置的HttpModule对象,
循环调用Init方法,为application对象里面的某些事件注册方法(即向请求管道里的时间注册用户的代码)
RouteData routeData =this.RouteCollection.GetRouteData(context);
根据上下文中的Url去路由表中匹配所有的路由规则,匹配了就返回一个路由对象.
如果路由对象等于null,那么什么都不干.也就是就算是普通的aspx也会走这里,只不过根据aspx路径是匹配不到路由的.那么此时第7个事件是什么都不干的,接着走第八个事件
如果请求的是aspx,在第8个事件就创建页面类对象.
如果找到了路由匹配,那么第7个事件就会创建一个MvcHandler存在HttpContext上下文的RemapHandler中,接着第8个事件判断一下上下文是否有MvcHandler这个对象,如果有的话就不做任何事情,如果没有那就证明不是mvc网站,就会根据url的后缀去创建请求的页面类对象.所以asp.net webform和asp.net mvc共用同一套.net框架
版权声明:本文为博主原创文章,转载请注明详细来源。
【深入ASP.NET原理系列】--Asp.Net Mvc和Asp.Net WebForm共用一套ASP.NET请求管道的更多相关文章
- 【深入ASP.NET原理系列】--ASP.NET页面生命周期
前言 ASP.NET页面运行时候,页面将经历一个生命周期,在生命周期中将执行一系列的处理步骤.包括初始化.实例化控件.还原和维护状态.运行时间处理程序代码以及进行呈现.熟悉页面生命周期非常重要,这样我 ...
- 【深入ASP.NET原理系列】--ASP.NET请求管道、应用程序生命周期、整体运行机制
微软的程序设计和相应的IDE做的很棒,让人很快就能有生产力..NET上手容易,生产力很高,但对于一个不是那么勤奋的人,他很可能就不再进步了,没有想深入下去的动力,他不用去理解整个框架和环境是怎么执行的 ...
- 【深入ASP.NET原理系列】--Asp.Net Mvc和Asp.Net WebForm实际上共用一套ASP.NET请求管道
.NET FrameWork4在系统全局配置文件(如在如下目录中C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config) 中添加了一个名字叫Url ...
- ASP.NET Core系列(三):启动类Startup
前面讲了ASP.NET Core 的项目结构,查看完整的ASP.NET Core系列文章:https://www.cnblogs.com/zhangweizhong/category/1477144. ...
- 探索ASP.NET MVC5系列
探索ASP.NET MVC5系列之~~~6.Session篇(进程外Session) 探索ASP.NET MVC5系列之~~~5.缓存篇(页面缓存+二级缓存) 探索ASP.NET MV ...
- ASP.NET请求管道、应用程序生命周期、整体运行机制
我们知道在ASP.NET中,若要对ASP.NET应用程序进行 初始化并使它处理请求,必须执行一些处理步骤,熟悉应用程序生命周期非常重要,这样才能在适当的生命周期阶段编写代码,达到预期的效果.永远不要做 ...
- [Asp.net MVC]Asp.net MVC5系列——在模型中添加验证规则
目录 概述 在模型中添加验证规则 自定义验证规则 伙伴类的使用 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net MVC5 ...
- 《ASP.NET SignalR系列》第五课 在MVC中使用SignalR
接着上一篇:<ASP.NET SignalR系列>第四课 SignalR自托管(不用IIS) 一.概述 本教程主要阐释了如何在MVC下使用ASP.NET SignalR. 添加Signal ...
- [Asp.net MVC]Asp.net MVC5系列——添加视图
目录 系列文章 概述 添加视图 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 概述 在这一部分我们添加一个新的控制器HelloWorldController类, ...
随机推荐
- Entity Framework在Asp.net MVC中的实现One Context Per Request(附源码)
上篇中"Entity Framework中的Identity map和Unit of Work模式", 由于EF中的Identity map和Unit of Work模式,EF体现 ...
- Asp.net MVC Razor模板引擎技巧分享
Razor是Asp.net MVC中新的默认模板类型, 语法简单易用.这篇文章不涉及Razor的语法,主要介绍Razor的一些在MVC项目中的使用技巧,以及脱离MVC环境下,如何使用Razor. 阅读 ...
- 深入解析Windows操作系统笔记——CH1概念和术语
1.概念和工具 本章主要介绍Windows操作系统的关键概念和术语 1.概念和工具 1.1操作系统版本 1.2基础概念和术语 1.2.1Windows API 1.2.2 服务.函数和例程 1.2.3 ...
- DGbroker主备切换
1.检查DG是否正常 DGMGRL> show configuration; Configuration - dgc Protection Mode: MaxProtection Databas ...
- WIN7管理工具配置ODBC数据源-系统DSN中无Oracle,Sybase驱动的解决方法
在C:\Windows\SysWOW64下找到: odbcad32.exe 这个文件,双击打开. 点击添加按钮,选择 对应的 驱动,然后就可用添加连接Oracle/Sybase的ODBC的数据源了.
- Java 代码的基本知识(摘)
(摘自:Java经典入门教程) http://wenku.baidu.com/link?url=IoWI58cD5vzeHN-NL4pN7Gren-RfzydrhjDlETAByC9L-9ANinyL ...
- linux 进程管理相关内容
简介 当我们运行程序时,Linux会为程序创建一个特殊的环境,该环境包含程序运行需要的所有资源,以保证程序能够独立运行,不受其他程序的干扰.这个特殊的环境就称为进程. 每个 Linux 命令都与系统中 ...
- 跨应用程序域(AppDomain)的单例(Singleton)实现
转载自: 跨应用程序域(AppDomain)的单例(Singleton)实现 - CorePlex代码库 - CorePlex官方网站,Visual Studio插件,代码大全,代码仓库,代码整理,分 ...
- 从vmware下载到Linux环境下jdk和maven的安装
写在前面:个人总结,如有不对请指出 操作环境: 操作系统:window7 企业版 处理器:Intel Core i5-4200U CPU @ 1.6GHz 内存:8G 系统类型:64位操作系统 需要安 ...
- linux 下 mysql 安装(不用编译的方式)
环境是centos6.x.相信其他的也大同小异.相对来说这种方式我用的比较多. 一些环境依赖表库: yum install perl yum install libaio 1)下载:在mysql的网站 ...