博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【深入ASP.NET原理系列】--Asp.Net Mvc和Asp.Net WebForm实际上共用一套ASP.NET请求管道...
阅读量:4671 次
发布时间:2019-06-09

本文共 2872 字,大约阅读时间需要 9 分钟。

.NET FrameWork4在系统全局配置文件(如在如下目录中C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config)

中添加了一个名字叫UrlRoutingModule的HttpModule

通过反编译工具我们可以看见

UrlRoutingModule是在System.Web程序集下,并不是在Mvc程序集里面,本身在.NETFrameWork框架中就有这个路由类,同时实现IHttpModule接口,那么它肯定有个Init方法.

 

可以看到它往我们的请求application对象,也就是我们的请求管道的第7个事件(

)上注册了一个方法.如下

 

1 public virtual void PostResolveRequestCache(HttpContextBasecontext) 2  3 { 4  5     RouteData routeData= this.RouteCollection.GetRouteData(context); 6  7    if (routeData != null) 8  9     {10 11        IRouteHandler routeHandler = routeData.RouteHandler;12 13        if (routeHandler == null)14 15        {16 17            throw newInvalidOperationException(string.Format(CultureInfo.CurrentCulture,SR.GetString("UrlRoutingModule_NoRouteHandler"), new object[0]));18 19        }20 21        if (!(routeHandler is StopRoutingHandler))22 23        {24 25            RequestContext requestContext = new RequestContext(context, routeData);26 27            context.Request.RequestContext = requestContext;28 29            IHttpHandler httpHandler = routeHandler.GetHttpHandler(requestContext);30 31            if (httpHandler == null)32 33            {34 35                 object[] args = new object[] {routeHandler.GetType() };36 37                 throw newInvalidOperationException(string.Format(CultureInfo.CurrentUICulture,SR.GetString("UrlRoutingModule_NoHttpHandler"), args));38 39            }40 41            if (httpHandler is UrlAuthFailureHandler)42 43            {44 45                 if(!FormsAuthenticationModule.FormsAuthRequired)46 47                 {48 49                     throw newHttpException(0x191, SR.GetString("Assess_Denied_Description3"));50 51                 }52 53                UrlAuthorizationModule.ReportUrlAuthorizationFailure(HttpContext.Current,this);54 55            }56 57            else58 59            {60 61                context.RemapHandler(httpHandler);62 63            }64 65        }66 67     }68 69 }
View Code

 

我们可以看到这个方法一开始就使用了静态路由表中的的数据,而这个静态路由表数据正是我们在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框架

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

 

转载于:https://www.cnblogs.com/zhangyihui/p/4801947.html

你可能感兴趣的文章
[Alpha阶段]第二次Scrum Meeting
查看>>
关于Java 8 forEach
查看>>
.NET设计模式(1):1.1 单例模式(Singleton Pattern)
查看>>
创建模态对话框和非模态对话框
查看>>
08-图8 How Long Does It Take
查看>>
二维数组中最大连通子数组
查看>>
java 正则表达式-忽略大小写与多行匹配
查看>>
mac 上亚马逊密钥登录
查看>>
css选择器中:first-child与:first-of-type的区别
查看>>
nopcommerce 二次开发
查看>>
NHibernate入门实例
查看>>
IBM_DS5020磁盘阵列做raid、热备并把盘阵挂在服务器上的步骤
查看>>
svg制作风车旋转
查看>>
《软件工程》课堂作业:返回一个整数数组中最大字数组的和
查看>>
ACM 美素数 (没AC)
查看>>
Sqlserver学习研究
查看>>
VTK图形模型主要对象
查看>>
c# Linq实现 获得某一个路径下所有文件的名(不含扩展名)
查看>>
动静态广播的区别
查看>>
前缀式计算(前缀表达式)
查看>>