版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/qq1010885678/article/details/37540769
當使用者起一個請求到伺服器,伺服器接收到請求并将該頁面傳回給浏覽器。
這一個看似簡單的過程中間到底經曆了什麼?
我們可以稱這一過程為頁面的生命周期,即,一個頁面從開始被請求到請求結束銷毀的過程
而這其中aspx和ashx的生命周期又不一樣,mvc的生命周期更是大不相同
首先僅讨論aspx和ashx
因為這兩者的生命周期非常相似
不同點僅僅在于aspx多幹了幾件事情
這從ashx頁面的ProcessRequest方法中可以看出一二(以下稱ProcessRequest方法是pr方法)
首先
使用者起一個請求到伺服器
iis伺服器接收到使用者的請求,并判所請求的檔案類型
如果是html,css,js,jpg等靜态的檔案
iis将會在本地磁盤上找到相關的檔案直接發送回浏覽器
這就是為什麼靜态頁的相應速度比較快,要使用頁面靜态化技術的原因
如果是aspx,ashx甚至可能是php,jsp這種動态頁面又該怎麼處理呢?
在iis中儲存着一張映射表
該表中記錄着各個動态檔案所對應的字尾名
以及對應的可以處理該動态檔案的程式集
比如:aspx和ashx對應的為aspnet_isapi.dll
iis通過這個起着橋梁作用的程式集與.net framework相連
将iis不能處理的動态檔案交給framework處理
在framework中經過一系列的處理裝載生成了對應的頁面
在通過橋梁傳回給iis,之後再傳回給浏覽器
這就是簡單的asp.net生命周期過程
如下圖(asp.net請求管道第一版):
詳細的asp.net頁面生命周期:
浏覽器發送請求到iis
iis無法處理動态頁面
交給 映射表中對應的擴充程式集
将請求發給 Framework
調用HttpRuntime.ProcessRequest()方法開始整個asp.net生命周期( HttpRuntime中有一個指向擴充程式的指針用來接受和發送封包 )
這時會先建立一個HttpWorkRequest對象,裡面存放着請求的原始封包資料
根據 HttpWorkRequest對象建立一個HttpContext對象存放處理過的封包資訊以供給程式員使用,全都封裝在
context對象中的Request屬性中,如Request.Form,而Response屬性中将會儲存生成的響應封包的資料(這裡有沒有覺得很熟悉,我們經常會使用到的方法和屬性就是這裡來的)
在這之後會通過HttpApplicationFactory 建立一個 HttpApplication然後調用ProcessRequest方法來處理整個請求(這裡也會用到HttpContext上下文封裝的請求資訊)
在該pr方法中按照執行順序的19個事件的過程組成了一個請求管道(這個pr方法其實就是執行一系列的事件)
其中第八個事件時建立被請求的頁面類對象并轉成IHttpHandler接口(對這個接口有沒有很熟悉)
在11與12個事件之間執行頁面類對象的ProcessRequest方法
在這裡,ashx的pr方法是直接提供給程式員寫的,是以裡面隻是一些簡單的代碼
而aspx的pr方法中,還調用了BuildControlTree()生成頁面空間樹,之後調用Rend方法根據空間樹生成html代碼
這就是為ashx響應速度會比aspx快,因為ashx的pr方法很簡潔
所有事件執行完畢
之後,會有一個FinishRequest方法結束請求管道
在通過HttpWorkRequest 将生成的html代碼傳回給擴充程式
交給iis
傳回給浏覽器
詳情如下圖:
借助反編譯攻擊Reflector我們可以看到生命周期的整個過程
記錄的不怎麼清楚,自己的了解也表達不清楚
希望大俠給予指導