【深入ASP.NET原理系列】--ASP.NET请求管道对Asp.Net WebForm和Asp.Net Mvc的处理通用部分
2015-09-08 21:17
841 查看
.NET FrameWork4在系统全局配置文件(如在如下目录中C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config)
中添加了一个名字叫UrlRoutingModule的HttpModule
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去路由表中匹配所有的路由规则,匹配了就返回一个路由对象.
[b]如果路由对象等于null,那么什么都不干.[/b]也就是就算是普通的aspx也会走这里,只不过根据aspx路径是匹配不到路由的.那么此时第7个事件是什么都不干的,接着走第八个事件
如果请求的是aspx,在第8个事件就创建页面类对象.
[b]如果找到了路由匹配,那么第7个事件就会创建一个MvcHandler[/b]存在HttpContext上下文的RemapHandler中,接着第8个事件判断一下上下文是否有MvcHandler这个对象,如果有的话就不做任何事情,如果没有那就证明不是mvc网站,就会根据url的后缀去创建请求的页面类对象.所以asp.net webform和asp.net mvc共用同一套.net框架
版权声明:本文为博主原创文章,转载请注明详细来源。
中添加了一个名字叫UrlRoutingModule的HttpModule
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[0])); } 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); } } } }
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去路由表中匹配所有的路由规则,匹配了就返回一个路由对象.
[b]如果路由对象等于null,那么什么都不干.[/b]也就是就算是普通的aspx也会走这里,只不过根据aspx路径是匹配不到路由的.那么此时第7个事件是什么都不干的,接着走第八个事件
如果请求的是aspx,在第8个事件就创建页面类对象.
[b]如果找到了路由匹配,那么第7个事件就会创建一个MvcHandler[/b]存在HttpContext上下文的RemapHandler中,接着第8个事件判断一下上下文是否有MvcHandler这个对象,如果有的话就不做任何事情,如果没有那就证明不是mvc网站,就会根据url的后缀去创建请求的页面类对象.所以asp.net webform和asp.net mvc共用同一套.net框架
版权声明:本文为博主原创文章,转载请注明详细来源。
相关文章推荐
- Asp.net 两个链接实现虾米音乐搜索
- asp.net用户自定义控件传参
- Asp.net MVC 与 Asp.net Web API 区别
- asp.net为关键词加上超链接,C#.net 为关键词加上超链接
- ASP.NET - 多级分类
- ASP.NET Authentication - Form Authentication
- (转)ASP.NET Identity入门系列教程(一) 初识Identity
- ASP.NET MVC 扩展HtmlHelper类方法
- Asp.Net Mvc4分页,扩展HtmlHelper类
- Aspose.words编程指南之DocumentBuilder二
- 树莓派2B使用360随身WiFi2代连接WiFi
- 树莓派2B安装配置
- 同一Session中的aspx页面的并发限制
- 基于ASP.NET的comet简单实现
- Asp.net笔记
- JS编码和Asp.net编码
- asp.net Cache
- ASP.NET MVC 3 loginUrl自动变成Account/Login,并且发生404错误的解决方法
- asp.net单文件带进度条上传的解决方案
- asp.net上传文件到数据库的解决方案