.NET FrameWork4在系統全局配置文件(如在如下目錄中C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config)
中添加了一個名字叫UrlRoutingModule的HttpModule
通過反編譯工具我們可以看見
UrlRoutingModule是在System.Web程序集下,並不是在Mvc程序集里面,本身在.NETFrameWork框架中就有這個路由類,同時實現IHttpModule接口,那么它肯定有個Init方法.
可以看到它往我們的請求application對象,也就是我們的請求管道的第7個事件(PostResolveRequestCache
)上注冊了一個方法.如下

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 else 58 59 { 60 61 context.RemapHandler(httpHandler); 62 63 } 64 65 } 66 67 } 68 69 }
我們可以看到這個方法一開始就使用了靜態路由表中的的數據,而這個靜態路由表數據正是我們在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框架
版權聲明:本文為博主原創文章,轉載請注明詳細來源。