綠色資源(yuán)網:您身邊最放心的安全下載站! 最新(xīn)軟件(jiàn)|熱門排(pái)行(háng)|軟件分類|軟件專題|廠商大全

綠色資源網

技術教程
您的位置:首頁網(wǎng)絡編程.Net編程 → IIS處(chù)理(lǐ)Asp.net請求和 Asp.net頁麵生命周期

IIS處(chù)理Asp.net請求和 Asp.net頁麵生命周期

我要評論 2011/04/01 23:25:32 來(lái)源:綠(lǜ)色(sè)資源網 編輯:ynaad.com [ ] 評論(lùn):0 點擊:197次

當一個客戶端頁麵訪(fǎng)問(wèn)IIS試圖獲取一些信息的(de)時候,發生了什麽事情?一(yī)個請求在通過了HTTP管道後又發生了什麽?本(běn)文主(zhǔ)要是描述(shù)這兩個過程,即IIS處理(lǐ)asp.net請(qǐng)求和asp.net的頁麵生命(mìng)周期。歡迎大家(jiā)積極拍磚,共(gòng)同學習,共同進步。

首先我們要弄清楚兩個非常重要的概念:

1, worker process(w3wp.exe). worker process管理所有的來(lái)自客戶端的請求(qiú)並給出響應。它是IIS下asp.net應(yīng)用程序的核(hé)心。

2, application pool. 它是worker process的容器,IIS5及之前的IIS版本均沒(méi)有application pool的概念。每一個application pool對應著一個(gè)worker process,在IIS Metabase中維護著Application Pool和worker process的Mapping。這就(jiù)避免(miǎn)了IIS5中出(chū)現的worker process(IIS5中是aspnet_wp.exe,同一時間隻能運行一個該進程)崩潰(kuì),application全崩潰的局(jú)麵。

客戶端向IIS發出一個資源請求後發生了如下(xià)事情(qíng):

1, server接受(shòu)該請(qǐng)求

IIS6通過內核模式(Kernel mode)中的HTTP.SYS來分發各(gè)個Request到application pool。 這並不是隨機的過程,在application pool創建的時候就已經注冊(cè)到了HTTP.SYS,所以當請求來到時HTTP.SYS會直接發送到相應的application pool。 接下來在IIS的用戶模式(User mode)中,Web Admin Services (WAS) 做了從HTTP.SYS中得到Request並分發(fā)到application pool的工作。application pool直接把request傳遞給worker process。

2, 請求傳遞到worker process後,worker process初始(shǐ)化加載ASP.NET ISAPI(Internet Server Application Program Interface),ASP.NET ISAPI進而加載CLR創建托管環境。

(注:ISAPI隻是一個接口,起到一個代理的作用,主要能力就是根據Request URL的後綴來尋找該後綴(zhuì)的處理程序)

ASP.NET ISAPI定義在aspnet_isapi.dll中,它本身運行在一個非托管的環境(jìng)中。ASP.NET ISAPI開始一個HttpRuntime, HttpRuntime調用ProcessRequest方法來開始處理請求(qiú)。ProcessRequest根據ISAPI傳進來的iWRType 來創建不(bú)同的HttpWorkerRequest,從而屏蔽了不同(tóng)IIS的差(chà)異。接下來ProcessRequest方法創建了HttpContext,我們使用HTTPContext.Current來(lái)訪問它。在HttpRuntime使用HttpApplicationFactory創建了HttpApplication對象(IHttpHandler)以後,所有的請求都會在通過httpmodule後(hòu)找到相應的Httphandler進(jìn)行處理。在HttpApplicationFactory創建HttpApplication之前,會(huì)查找config(web.config和(hé)Machine.config)文件中注冊的所有的HttpModule,並根(gēn)據配置信息加載相(xiàng)應的Assembly,通過Reflection創建(jiàn)對應的HttpModule,並將這些(xiē)Module加到HttpApplication 的(de)_moduleCollection Filed中(zhōng)。我們對一個Application的請求最終會落到一個HttpApplication對象上(shàng)。當一個請求(qiú)到來時,ASP.NET會在Httplication Pool中查找未被使用的HttpApplication對(duì)象。

3, 請求通過HTTP管道後,每個請求(qiú)都發向相關的各自的httphandler,IIS請求處理過程結束。

HttpHandler是(shì)HTTP管道的終點,它(tā)為每個request生成輸出。System.Web.UI.Page就是這樣一個典(diǎn)型的Httphandler,當我們請求一個aspx頁麵,這個HttpHandler就生成html發送回客(kè)戶端。看Page類的簽名:

public class Page : TemplateControl, IHttpHandler

{

}

可以看到,Page類就是一個HttpHandler。

綜上整個過程就是:當客戶端向(xiàng)服務器發送(sòng)資源(yuán)請求(qiú)時(shí),請求首先到達IIS的(de)HTTP.SYS。然後HTTP.SYS發送請求道對應的Application Pool。 然後Application Pool發送請求到Worker Process(W3WP.exe)中(zhōng)加載ISAPI Extension,ISAPI創建一個HttpRuntime對象來通過HttpModule和HttpHandler處理請求。 然後頁麵生命周期就開始了。

4, 頁麵(miàn)生命周期開始

頁麵生(shēng)命周期的主要階段包括(kuò):

頁麵初始化(Init): 服務器(qì)創建服務器(qì)控(kòng)件的(de)實例

加載(load): 控件實例(lì)被加載到它定義的頁麵對象中

預輸出:(PreRender) 對(duì)控件的更改被(bèi)更(gèng)新,準備輸出。

保存(SaveViewState): 控件(jiàn)的狀態信息(xī)被保存。

輸出(chū)頁麵(Render):服務器為控件創建html標記(jì)。

處理(Dispose): 主要做的工作就是dispose, 關閉數據庫連接(jiē),文件(jiàn)資源的釋放等。

卸載(Unload):銷毀(huǐ)服務器控件的(de)實例

頁麵生命周期(qī)的主要事件:

PreInit:

1.檢查IsPostBack 屬性

2.動態設置Master Page

3.動態設置Theme

4.設置控件的默認值(UniqueId等)

5.重新創建動態控件(初始化控件(jiàn)),初始化控件的值

Init: 這個事件(jiàn)發生在所有的控件被初始化,所有的皮膚設置被應(yīng)用以後。它用來讀取或者(zhě)初始化控件屬(shǔ)性。它能夠用來注冊一些aspx頁麵中沒(méi)有指出的控件的(de)事件。

InitComplete: Use this event for processing tasks that require all initialization to be complete.

PreLoad: 加載頁麵(miàn)的(de)ViewState和所有的控件,然後處理所有(yǒu)的包含在Request實例中的postback數據。

Load: 這個(gè)事件可能是大家最熟悉(xī)的(de)了。需要注意的是,Page對象(xiàng)會遞歸的調用子控件的(de)onload事件直到頁麵和所有的子控件被加載(zǎi)完成。這個事件主要用來設(shè)置控件屬性的值,建立數據(jù)庫連接(通常不這麽做)。

Control events: 這個就不多說了,主要是處理(lǐ)控件(jiàn)的(de)事件,例如click。這也就讓我們明白了每次我們click一個Button的時候(hòu),實際上是要先去執(zhí)行load事件然後才執行(háng)click事件的,一般我們用!IsPostBack來判斷一下從(cóng)而避免執行不必要(yào)的加載邏輯。

LoadComplete: 頁麵所(suǒ)有的控件(jiàn)都被加載以後執行,暫時(shí)沒有想到用來幹什麽。。。

PreRender: 在HTML被生成之前這是最後一個事件。每一個頁麵中的控件都有PreRender的過程。在這裏對(duì)將要輸出(chū)的HTML結(jié)果(guǒ)進行最後一次修(xiū)改。

SaveStateComplete: 在這個時間發生之前(qián),已經保存了所(suǒ)有(yǒu)控件和頁麵的,任何對page或者控(kòng)件的改動都不會產生左(zuǒ)右。暫(zàn)時沒想到用來幹啥。

Render: 它不是一個事件而是一個方法。工作就是把HTML寫回客戶端瀏覽器。

UnLoad: 頁麵中的每一個控件都會發生這件事。在(zài)控(kòng)件中,使用這個事件來做清理工作,例如關閉(bì)數據庫連接等。對與頁麵本身(shēn)也是做清理工(gōng)作,例如關閉打開的文件和數據(jù)庫連接,或者結(jié)束日誌或者其它指定的工(gōng)作。

需要說明的是(shì),每次Request都會創建一個全新(xīn)的Page類的實例,所以在頁麵中的自(zì)己定義的字段是不能在兩次request中(zhōng)傳遞值的,需要使用viewstate來存儲。

5, HttpHandler根據頁麵生(shēng)命周期中事(shì)件的處理把結果發回IIS,IIS再把(bǎ)結果發回客(kè)戶端瀏覽器。

值得(dé)注意的是,在這(zhè)個過程中請(qǐng)求會再次通過HttpModule(注冊一個EndRequest事件)。

至此,整個Request結束。

關鍵詞:IIS,Asp.net

閱讀本文後您有什麽(me)感(gǎn)想? 已(yǐ)有 人給出評價!

  • 0 歡迎喜歡
  • 0 白(bái)癡(chī)
  • 0 拜托(tuō)
  • 0 哇(wa)
  • 0 加油
  • 0 鄙視
免费人欧美成又黄又爽的视频丨一本色道久久88综合日韩精品丨国产专区日韩精品欧美色丨午夜无遮挡男女啪啪视频丨国产欧美日韩综合精品一区二区丨亚洲精品无码不卡在线播HE丨亚洲精品国产精品国自产观看丨日韩国产高清av不卡