.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框架

版权声明:本文为博主原创文章,转载请注明详细来源。

最新文章

  1. 可变长子网掩码 VLSM
  2. Enable Cross-Origin Requests in Asp.Net WebApi 2[Reprint]
  3. sphinx索引分析——文件格式和字典是double array trie 检索树,索引存储 – 多路归并排序,文档id压缩 – Variable Byte Coding
  4. linux下bom头导致的php调用php接口 返回的json字符串 无法转成 数组,即json字符串无法解码的问题
  5. idea community 配置已有的scala工程
  6. Web Farm 和Web Garden
  7. C语言时间函数
  8. motto6
  9. 如何让Advanced Installer卸载软件时保留一些文件
  10. OSTaskCreateExt() 建立任务
  11. Jndi and c3p0 in Tomcat
  12. ITest
  13. python常用操作
  14. 命名空间“Microsoft.AspNet”中不存在类型或命名空间名“Mvc”
  15. Linux Tomcat安装,Linux配置Tomcat,Linux Tomcat修改内存,Linux tomcat修改端口
  16. 使用multer搭建一个图片接收服务器
  17. Java课程寒假之《人月神话》有感之二
  18. [matlab] 15.罚函数降维
  19. kali 安装google chrome浏览器(离线手动)
  20. Asp.Net MVC三层架构之autofac使用教程

热门文章

  1. 常用的sublime text 3插件
  2. 24 AdminLTE 基础入门
  3. [转帖]70亿!以色列间谍产品公司NSO要被卖掉了
  4. 虚拟机CentOS创建/使用快照
  5. Spring整合Hibernate的两种方式
  6. pytest_04_测试用例setup和teardown
  7. [Atcoder AGC037E]Reversing and Concatenating
  8. ODBC数据导入
  9. 软件测试人员必备的Python知识图库
  10. JavaScript实现网页回到顶部效果