我一直疑惑於如下問題,從客戶端發出一個請求,請求到達服務器端是怎樣跟iis銜接起來的,而iis又是怎樣讀取我發佈的代碼的,並返回服務器上的文件。這其中是怎樣的一個處理過程。html
1:當你從瀏覽器中輸入一個地址或點擊一個連接開始,你就已經發出了一個http請求(會根據請求者請求的主機頭或者IP或者端口號來找到對應的站點);web
2:根據http協議,當請求到達相應的主機服務器時,由服務器上的系統進程http.sys(能夠理解爲專門處理http請求的進程)接收;api
3:http.sys接收到請求信號後,傳遞給應用程序池的工做者進程,即IIS進程 inetinfo.exe,注意:這時候服務器進程與IIS銜接起來了。瀏覽器
IIS進程能夠處理通常的靜態頁面如.html,處理完後直接將找到的html頁面返回到客戶端顯示;服務器
4:若是是.aspx 或cshtml等頁面,IIS不能直接處理,這時,IIS進程會加載一個叫aspnet_isapi.dll;mvc
5:當ISAPI收處處理請求後,會啓動一個ASP.NET工做進程,而後將請求信息轉交給ASP.NET工做進程(ASPNET_WP.EXE),注意:這時候IIS與ASP.NET銜接起來了。接下來,控制權由ASPNET_WP掌握。app
【 咱們先來了解下APPDOMAIN是什麼, 感受這篇不錯http://allanpie.blog.163.com/blog/static/21320410200921311273632/, 我理解APPDOMAIN就是一個可以處理 aspnet進程(.dll)的環境或應用程序域,咱們知道ASP.NET程序的運行須要以.NET Framework爲基礎平臺,經過CLR(公共語言運行庫)託管才能運行。ASP.NET是一個複雜的使用託管代碼來從頭至尾處理Web請求的引擎.框架
APPDOMAIN中有幾個重要的對象。asp.net
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