【深入ASP.NET原理系列】--Asp.Net Mvc和Asp.Net WebForm實際上共用一套ASP.NET請求管道


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

版權聲明:本文為博主原創文章,轉載請注明詳細來源。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM