mvc和iis工作原理


我一直疑惑於以下問題,從客戶端發出一個請求,請求到達服務器端是怎樣跟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 類的開發人員尤其需要注意這些事件。

  1. 對請求進行驗證,將檢查瀏覽器發送的信息,並確定其是否包含潛在惡意標記。有關更多信息,請參見 ValidateRequest 和腳本侵入概述

  2. 如果已在 Web.config 文件的 UrlMappingsSection 節中配置了任何 URL,則執行 URL 映射。

  3. 引發 BeginRequest 事件。

  4. 引發 AuthenticateRequest 事件。

  5. 引發 PostAuthenticateRequest 事件。

  6. 引發 AuthorizeRequest 事件。

  7. 引發 PostAuthorizeRequest 事件。

  8. 引發 ResolveRequestCache 事件。

  9. 引發 PostResolveRequestCache 事件。

  10. 根據所請求資源的文件擴展名(在應用程序的配置文件中映射),選擇實現 IHttpHandler 的類,對請求進行處理。如果該請求針對從 Page 類派生的對象(頁),並且需要對該頁進行編譯,則 ASP.NET 會在創建該頁的實例之前對其進行編譯。

  11. 引發 PostMapRequestHandler 事件。

  12. 引發 AcquireRequestState 事件。

  13. 引發 PostAcquireRequestState 事件。

  14. 引發 PreRequestHandlerExecute 事件。

  15. 為該請求調用合適的 IHttpHandler 類的 ProcessRequest 方法(或異步版 BeginProcessRequest)。例如,如果該請求針對某頁,則當前的頁實例將處理該請求。

  16. 引發 PostRequestHandlerExecute 事件。

  17. 引發 ReleaseRequestState 事件。

  18. 引發 PostReleaseRequestState 事件。

  19. 如果定義了 Filter 屬性,則執行響應篩選。

  20. 引發 UpdateRequestCache 事件。

  21. 引發 PostUpdateRequestCache 事件。

  22. 引發 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

http://blog.csdn.net/wx845204140/article/details/7194743


免責聲明!

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



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