.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请求管道的更多相关文章

  1. 【深入ASP.NET原理系列】--ASP.NET页面生命周期

    前言 ASP.NET页面运行时候,页面将经历一个生命周期,在生命周期中将执行一系列的处理步骤.包括初始化.实例化控件.还原和维护状态.运行时间处理程序代码以及进行呈现.熟悉页面生命周期非常重要,这样我 ...

  2. 【深入ASP.NET原理系列】--ASP.NET请求管道、应用程序生命周期、整体运行机制

    微软的程序设计和相应的IDE做的很棒,让人很快就能有生产力..NET上手容易,生产力很高,但对于一个不是那么勤奋的人,他很可能就不再进步了,没有想深入下去的动力,他不用去理解整个框架和环境是怎么执行的 ...

  3. 【深入ASP.NET原理系列】--Asp.Net Mvc和Asp.Net WebForm实际上共用一套ASP.NET请求管道

    .NET FrameWork4在系统全局配置文件(如在如下目录中C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config) 中添加了一个名字叫Url ...

  4. ASP.NET Core系列(三):启动类Startup

    前面讲了ASP.NET Core 的项目结构,查看完整的ASP.NET Core系列文章:https://www.cnblogs.com/zhangweizhong/category/1477144. ...

  5. 探索ASP.NET MVC5系列

    探索ASP.NET MVC5系列之~~~6.Session篇(进程外Session)     探索ASP.NET MVC5系列之~~~5.缓存篇(页面缓存+二级缓存)     探索ASP.NET MV ...

  6. ASP.NET请求管道、应用程序生命周期、整体运行机制

    我们知道在ASP.NET中,若要对ASP.NET应用程序进行 初始化并使它处理请求,必须执行一些处理步骤,熟悉应用程序生命周期非常重要,这样才能在适当的生命周期阶段编写代码,达到预期的效果.永远不要做 ...

  7. [Asp.net MVC]Asp.net MVC5系列——在模型中添加验证规则

    目录 概述 在模型中添加验证规则 自定义验证规则 伙伴类的使用 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net MVC5 ...

  8. 《ASP.NET SignalR系列》第五课 在MVC中使用SignalR

    接着上一篇:<ASP.NET SignalR系列>第四课 SignalR自托管(不用IIS) 一.概述 本教程主要阐释了如何在MVC下使用ASP.NET SignalR. 添加Signal ...

  9. [Asp.net MVC]Asp.net MVC5系列——添加视图

    目录 系列文章 概述 添加视图 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 概述 在这一部分我们添加一个新的控制器HelloWorldController类, ...

随机推荐

  1. ORACLE关于索引是否需要定期重建争论的整理

    ORACLE数据库中的索引到底要不要定期重建呢? 如果不需要定期重建,那么理由是什么? 如果需要定期重建,那么理由又是什么?另外,如果需要定期重建,那么满足那些条件的索引才需要重建呢?关于这个问题,网 ...

  2. ORACLE TO_CHAR函数格式化数字的出现空格的原因

    在这篇博客SQL挑战--如何高效生成编码里面我由于需要将数字格式化为字符,像12需要格式化0012这样的字符,所以使用了TO_CHAR(数字,'0000')这样的写法,后面0000表示缺省补零,测试过 ...

  3. java.lang.UnsatisfiedLinkError: Unable to load library 'xxx': Native library (win32-x86-64/ID_Fpr.dll)

    使用 JNA 调用 dll 库,因为 dll 库是32 位的,而 jvm 是 64位的,所以发生的错误: java.lang.UnsatisfiedLinkError: Unable to load ...

  4. 企业邮箱在Android(安卓)系统手机上POP3/IMAP协议的设置方法

    此处以三星(系统版本4.4.2)为例,介绍下使用安卓系统自带的客户端如何设置pop/imap协议方式方法 以下我们将使用test@zhuyuming.so 为测试案例,请您操作时更换成您自己的邮箱账号 ...

  5. Eclipse和PyDev搭建完美Python开发环境(Windows篇)

    目录安装Pythonpython for eclipse插件安装配置PyDev插件测试 安装Python从网站上下载最新的版本,从http://python.org/download/下载.安装过程与 ...

  6. 内部类访问的局部变量必须加final

    (1)内部类是外部类的一个成员,就像外部类的成员方法一样,所以内部类有权限访问外部类的所有成员,包括private的.  (2)内部类不能访问外部类方法中的局部变量,除非变量是final的(一般发生在 ...

  7. 虚拟机群安装多个hadoop集群时遇到的问题

    背景,原来在我的虚拟机集群(nn1,nn2)中安装的是cdh23502,后来做升级实验,升到cdh26550,因为生产中使用的环境是cdh23502,所以再次切换回去. 切换的过程中,遇到一些问题,特 ...

  8. 大一上学期的一点小疑惑,代码验证ok

    #include<iostream> using namespace std; class test { int *p; int pn; public: test(int n) { p = ...

  9. 借用Snippet插件美化博客中的代码

    书写博客,难免要贴出代码.然而直接贴出代码,则不美观.于是,应运而生出现了很多代码美化的插件.其中比较有名的是Syntax Highlighting插件.   笔者在网上翻阅的时候发现了Snippet ...

  10. POJ 3384 Feng Shui --直线切平面

    题意:房间是一个凸多边形,要在里面铺设两条半径为r的圆形地毯,可以重叠,现在要求分别铺设到哪,使地毯所占的地面面积最大. 解法:要使圆形地毯所占面积最大,圆形地毯一定是与边相切的,这样才能使尽量不重叠 ...