.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 MVC 多语言(html+js共用一套资源文件)

    此文主要是最近做多语言的工作的一个经验分享.文中的内容为参照多位大神的方案后,自己揉捏出来的一个新的方案,对于html和javascript部分的多语言的切换,共用一套资源文件.代码中主要是使用 IH ...

  5. 【目录】asp.net core系列篇

    随笔分类 - asp.net core系列篇 asp.net core系列 68 Filter管道过滤器 摘要: 一.概述 本篇详细了解一下asp.net core filters,filter叫&q ...

  6. 探索ASP.NET MVC5系列

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

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

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

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

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

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

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

随机推荐

  1. git pull时的冲突解决方式; git stash; git fetch

    git fetch指令: https://www.yiibai.com/git/git_pull.html 发现远端有更新,git pull时,如果你本地分支修改了东西,导致git pull有冲突,失 ...

  2. matlab柱状图画法

    %%各时段电量需求 clc close all clear all x = [11000 33000 25000 36000 25000 30000 18000]; tick = {'0-6' '6- ...

  3. 010 SpringCloud 学习笔记6-----Feign

    1.概述 Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样.你不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做. 2.入门案例 改造luc ...

  4. 基于DigitalOcean+LAMP+WordPress搭建个人网站

    1. 注册DigitalOcean并新建主机 为了搭建个人网站首先需要一个可以在公网范围访问的主机,可以选用国内如阿里云.国外如DigitalOcean的各种云主机提供商,这里选用DigitalOce ...

  5. AVR单片机教程——EasyElectronics Library v1.3手册

    bit.h delay.h pin.h wave.h pwm.h tone.h adc.h button.h switch.h rotary.h pot.h ldr.h led.h rgbw.h se ...

  6. 【LEETCODE】64、链表分类,medium&hard级别,题目:2,138,142,23

    package y2019.Algorithm.LinkedList.medium; import y2019.Algorithm.LinkedList.ListNode; /** * @Projec ...

  7. Golang ---testing包

    golang自带了testing测试包,使用该包可以进行自动化的单元测试,输出结果验证,并且可以测试性能. 建议安装gotests插件自动生成测试代码: go get -u -v github.com ...

  8. Golang/Go goroutine调度器原理/实现【原】

    Go语言在2016年再次拿下TIBOE年度编程语言称号,这充分证明了Go语言这几年在全世界范围内的受欢迎程度.如果要对世界范围内的gopher发起一次“你究竟喜欢Go的哪一点”的调查,我相信很多Gop ...

  9. txt文件每行内容与图片文件名字组合,输出txt格式

    import os dir_list = os.listdir('C:\\Users\\10107472\\Desktop\\practice\\JPEGImages')i=0f1=open('C:\ ...

  10. MySQL CentOS7 手动安装

    手动安装MySQL的目的: 1.一个服务器上可以同时装多个版本,甚至相同版本MySQL的多个实例,这种需求很常见: 2.一次初始化和配置后,可以快速复制到本服务器或其他服务器,及封装为初始MySQL的 ...