我一直疑惑於以下問題,從客戶端發出一個請求,請求到達服務器端是怎樣跟iis銜接起來的,而iis又是怎樣讀取我發布的代碼的,並返回服務器上的文件。這其中是怎樣的一個處理過程。
1:當你從瀏覽器中輸入一個地址或點擊一個鏈接開始,你就已經發出了一個http請求(會根據請求者請求的主機頭或者IP或者端口號來找到對應的站點);
2:根據http協議,當請求到達相應的主機服務器時,由服務器上的系統進程http.sys(可以理解為專門處理http請求的進程)接收;
3:http.sys接收到請求信號后,傳遞給應用程序池的工作者進程,即IIS進程 inetinfo.exe,注意:這時候服務器進程與IIS銜接起來了。
IIS進程可以處理一般的靜態頁面如.html,處理完后直接將找到的html頁面返回到客戶端顯示;
4:如果是.aspx 或cshtml等頁面,IIS不能直接處理,這時,IIS進程會加載一個叫aspnet_isapi.dll;
5:當ISAPI收到處理請求后,會啟動一個ASP.NET工作進程,然后將請求信息轉交給ASP.NET工作進程(ASPNET_WP.EXE),注意:這時候IIS與ASP.NET銜接起來了。接下來,控制權由ASPNET_WP掌握。
【 我們先來了解下APPDOMAIN是什么, 感覺這篇不錯http://allanpie.blog.163.com/blog/static/21320410200921311273632/, 我理解APPDOMAIN就是一個能夠處理 aspnet進程(.dll)的環境或應用程序域,我們知道ASP.NET程序的運行需要以.NET Framework為基礎平台,通過CLR(公共語言運行庫)托管才能運行。ASP.NET是一個復雜的使用托管代碼來從頭到尾處理Web請求的引擎.
APPDOMAIN中有幾個重要的對象。
ISAPIRUNTIME:專門負責解出http請求的必要信息,它將信息和請求轉交給HttpRuntime。
HttpRunTime:主要的工作便是為每一個提出請求的客戶建立一個HttpContext對象.這個東東又管理着HttpSession對象.
每一個訪問者有各自的HttpContext對象和HttpSession對象,這些對象,你可以在.NET FRAMEWORK庫中找到對應的類名,像System.Web.HttpContext,System.Web.
HttpSessionState等.這兩個對象是APPDOMAIN運行環境的一部分。這兩個類的全稱為System.Web.Hosting.ISAPIRuntime,System.Web.HttpRuntime。】
6:當控制權交給ASPNET_WP進程掌握后,如果沒有執行.net的環境,會先建立APPDOMAIN執行應用程序域,在APPDOMAIN建立時, ISAPIRUNTIME和HttpRuntime這兩個類會作為APPDOMAIN的一部分被實例化。
7:當APPDOMAIN初始化完成后,接下來就需要建立會話,將請求傳遞給其中的一個類HttpRunTime,他們之間的創建關系是:HttpRuntime負責創建HttpContext和HttpSession,
httpContext負責管理httpSession。
從提交http請求開始一直到這(HttpRuntime創建完httpContext為止),實際上,我們在服務器上發布的應用程序仍然沒有運行,或者說,請求者的請求實際上並未真正的被處理,前面的工作都是些准備性或者輔助性的工作.
8:接下來,HttpRuntime除了負責創建HttpContext和HttpSession外,還要創建了一個重要的對象HttpApplication.
HttpApplication調用ProcessRequest方法來處理用戶請求,具體說就是創建一個HttpContext實例,
9:HttpRuntime使用上下文信息查找或新建能處理該請求的WEB應用程序的對象。由HttpApplication Factory負責返回HttpApplication實例。HttpApplication對象使用IHttpHandlerFactory類型的實例返回HttpHandler(http處理程序)給HttpRuntime對象。一個頁面只是個http處理程序對象。
最后由HttpRuntime對象調用IHttpHandler的頁面對象的ProcessRequest方法。HttpHandler根據用戶請求文件的擴展名處理請求,並把請求的結果,也就是HTML發送到客戶瀏覽器.
在MVC源碼中MvcHandler類繼承了接口IHttpHandler,並實現了ProcessRequest(HttpContext httpContext)方法,該方法是MVC程序運行的入口。
10:此時,很想知道mvc中的路由是如何跟HttpApplication聯系起來的呢,UrlRoutingModule 如何截獲HttpApplicatioin的管道事件,從而把Http Request 引入Mvc框架中的。
在UrlRoutingModule.cs文件中,看到當UrlRoutingModule初始化並調用Init方法的時候注冊了HttpApplication的 PostResolveRequestCache管道事件,所以當HttpAplication對象(這里是MvcApplication)執行時就會觸 發PostResolveRequestCache事件,從而把HttpRequest引導進MVC module中
在ASP.NET MVC程序中首先涉及的部件是UrlRoutingModule,它是System.Web.Routing的一部分。UrlRoutingModule 用於第一次檢查請求的url和本地磁盤中的文件是否相匹配。如果匹配,UrlRoutingModule會將請求直接回發給IIS,IIS根據地址來進行 相應處理。如果UrlRoutingModule沒有在磁盤中找到匹配的文件。它會檢查RouteCollection結構來決定是否繼續傳遞請 求.UrlRoutingModule會引入RouteHandler和匹配的路徑入口(默認情況下是MvcRouteHandler)。而后會引入合適 的HttpHandler來處理和請求有關的邏輯。默認情況下,這個HttpHandler會是MvcHandler.
11:URL Routing組件是如何與ASP.NET MVC框架組合起來的。
在第一次啟動mvc程序的時候,在Application_Start函數中注冊路由RegisterRoutes(RouteTable.Routes);在routes.MapRoute(…)函數中,將自定義的路由規則注冊到System.Web.Routing 組件中, Route route = new Route(url, new MvcRouteHandler())
注:在處理該請求時將由 HttpApplication 類執行以下事件。希望擴展 HttpApplication 類的開發人員尤其需要注意這些事件。
-
對請求進行驗證,將檢查瀏覽器發送的信息,並確定其是否包含潛在惡意標記。有關更多信息,請參見 ValidateRequest 和腳本侵入概述。
-
如果已在 Web.config 文件的 UrlMappingsSection 節中配置了任何 URL,則執行 URL 映射。
-
引發 BeginRequest 事件。
-
引發 AuthenticateRequest 事件。
-
引發 PostAuthenticateRequest 事件。
-
引發 AuthorizeRequest 事件。
-
引發 PostAuthorizeRequest 事件。
-
引發 ResolveRequestCache 事件。
-
引發 PostResolveRequestCache 事件。
-
根據所請求資源的文件擴展名(在應用程序的配置文件中映射),選擇實現 IHttpHandler 的類,對請求進行處理。如果該請求針對從 Page 類派生的對象(頁),並且需要對該頁進行編譯,則 ASP.NET 會在創建該頁的實例之前對其進行編譯。
-
引發 PostMapRequestHandler 事件。
-
引發 AcquireRequestState 事件。
-
引發 PostAcquireRequestState 事件。
-
引發 PreRequestHandlerExecute 事件。
-
為該請求調用合適的 IHttpHandler 類的 ProcessRequest 方法(或異步版 BeginProcessRequest)。例如,如果該請求針對某頁,則當前的頁實例將處理該請求。
-
引發 PostRequestHandlerExecute 事件。
-
引發 ReleaseRequestState 事件。
-
引發 PostReleaseRequestState 事件。
-
如果定義了 Filter 屬性,則執行響應篩選。
-
引發 UpdateRequestCache 事件。
-
引發 PostUpdateRequestCache 事件。
-
引發 EndRequest 事件。
當我們對asp.net mvc網站發出一個請求的時候,會發生5個主要步驟:
步驟1:創建routetable 當asp.net應用程序第一次啟動的時候才會發生第一步。routetable把url映射到handler。
步驟2:urlroutingmodule攔截請求 第二步在我們發起請求的時候發生。urlroutingmodule攔截了每一個請求並且創建和執行合適的handler。
步驟3:執行mvchandler mvchandler創建了控制器,並且把控制器傳入controllercontext,然后執行控制器。
步驟4:執行控制器 控制器檢測要執行的控制器方法,構建參數列表並且執行方法。
步驟5:調用renderview方法 大多數情況下,控制器方法調用renderview()來把內容呈現回瀏覽器。controller.renderview()方法把這個工作委托給某個viewengine來做。




這些知識及圖片都是參考下面的博文總結來的,方便查看
參考:
http://blog.csdn.net/jilate/article/details/437506
http://www.cnblogs.com/tmfc/archive/2006/08/29/489779.html
http://blog.csdn.net/virone/article/details/4531800
http://msdn.microsoft.com/zh-cn/library/ms178473%28v=VS.80%29.aspx
