請求過來,根據ip和埠,由iis伺服器進行接收,如果是靜態文件則直接返迴文件內容,如果無法解析,則根據映射規則找到對應請求尾碼 的ASPNET_ISAPI.dll處理程式集,交由其進行處理。 1.此時會生成IsapRuntime,其創建了WorkRequest對象, 2.接下來實例化HttpRun ...
請求過來,根據ip和埠,由iis伺服器進行接收,如果是靜態文件則直接返迴文件內容,如果無法解析,則根據映射規則找到對應請求尾碼
的ASPNET_ISAPI.dll處理程式集,交由其進行處理。
1.此時會生成IsapRuntime,其創建了WorkRequest對象,
2.接下來實例化HttpRunTime,由其生成HttpContext上下文對象,此時就初始化了Request,Response,Session,Application,等內置對象,
3.然後創建了HttpApplicationFactory工廠對象,其在第一次訪問時調用了Global文件中的Application_Start方法,
生成HttpApplication對象,讀取系統的配置文件,其中就包括我們的路由配置和約束,並創建HttpModel對象,調用Init方法,並註冊這些方法到管道中,
4.由HttpApplication對象調用ProcessRequest,裡面負責執行了管道時間
4.1 第一個是事件 就是BeginRequest方法,然後重點來到第7個時間,創建MVCHandler對象 ,
4.1.1將HttpContext存入其中,並讀取路由表中的路由規則生成RouteData對象,和HttpContext一併存入從而創建RequestContext,再RequestContext對象傳入RoudlerHandler.GetHttpHandler從而獲取MVCHandler,並調用context.RemapHandler將mvchandler存入httpcontext中
4.2第8個事件則檢查HttpContext中RemapHandler是否為空,如果不為空則跳過此事件,這也是和aspx最重要的不同之一,在aspx中這裡是要打造頁面控制項樹的. 而.net mvc這裡是略過的
4.3來到第11至第12個事件之間會根據控制器名獲取控制器工廠來創建對應的控制器對象,傳入RequestContext調用控制器父類的ControllerBase的Execute方法,裡面就將RequestContext設置給ControllerContext,執行ExecuteCore方法, 其中就根據請求的方法名找到並調用對應的Action方法,也就是我們寫的業務,最後返回View,調用的是ActionResult.Execute 方法,,也就是父類的ViewResultBase.ExecuteResult,找到對應的視圖引擎, 獲取ViewEngineResult的View對象,獲取Response的TextWriter對象和ViewContext對象 來調用引擎的Render方法,生成html代碼並writer出去.