最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

IIS處理Asp.net請求和Asp.net頁面生命周期說明

 更新時間:2011年05月02日 12:38:32   作者:  
當一個客戶端頁面訪問IIS試圖獲取一些信息的時候,發(fā)生了什么事情?一個請求在通過了HTTP管道后又發(fā)生了什么?本文主要是描述這兩個過程,即IIS處理asp.net請求和asp.net的頁面生命周期。歡迎大家積極拍磚,共同學習,共同進步。
首先我們要弄清楚兩個非常重要的概念:
1, worker process(w3wp.exe). worker process管理所有的來自客戶端的請求并給出響應。它是IIS下asp.net應用程序的核心。
2, application pool. 它是worker process的容器,IIS5及之前的IIS版本均沒有application pool的概念。每一個application pool對應著一個worker process,在IIS Metabase中維護著Application Pool和worker process的Mapping。這就避免了IIS5中出現(xiàn)的worker process(IIS5中是aspnet_wp.exe,同一時間只能運行一個該進程)崩潰,application全崩潰的局面。
客戶端向IIS發(fā)出一個資源請求后發(fā)生了如下事情:
1, server接受該請求
IIS6通過內(nèi)核模式(Kernel mode)中的HTTP.SYS來分發(fā)各個Request到application pool。 這并不是隨機的過程,在application pool創(chuàng)建的時候就已經(jīng)注冊到了HTTP.SYS,所以當請求來到時HTTP.SYS會直接發(fā)送到相應的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初始化加載ASP.NET ISAPI(Internet Server Application Program Interface),ASP.NET ISAPI進而加載CLR創(chuàng)建托管環(huán)境。
(注:ISAPI只是一個接口,起到一個代理的作用,主要能力就是根據(jù)Request URL的后綴來尋找該后綴的處理程序)
ASP.NET ISAPI定義在aspnet_isapi.dll中,它本身運行在一個非托管的環(huán)境中。ASP.NET ISAPI開始一個HttpRuntime, HttpRuntime調(diào)用ProcessRequest方法來開始處理請求。ProcessRequest根據(jù)ISAPI傳進來的iWRType 來創(chuàng)建不同的HttpWorkerRequest,從而屏蔽了不同IIS的差異。接下來ProcessRequest方法創(chuàng)建了HttpContext,我們使用HTTPContext.Current來訪問它。在HttpRuntime使用HttpApplicationFactory創(chuàng)建了HttpApplication對象(IHttpHandler)以后,所有的請求都會在通過httpmodule后找到相應的Httphandler進行處理。在HttpApplicationFactory創(chuàng)建HttpApplication之前,會查找config(web.config和Machine.config)文件中注冊的所有的HttpModule,并根據(jù)配置信息加載相應的Assembly,通過Reflection創(chuàng)建對應的HttpModule,并將這些Module加到HttpApplication 的_moduleCollection Filed中。我們對一個Application的請求最終會落到一個HttpApplication對象上。當一個請求到來時,ASP.NET會在Httplication Pool中查找未被使用的HttpApplication對象。
3, 請求通過HTTP管道后,每個請求都發(fā)向相關的各自的httphandler,IIS請求處理過程結(jié)束。
HttpHandler是HTTP管道的終點,它為每個request生成輸出。System.Web.UI.Page就是這樣一個典型的Httphandler,當我們請求一個aspx頁面,這個HttpHandler就生成html發(fā)送回客戶端。看Page類的簽名:
public class Page : TemplateControl, IHttpHandler
{
}
可以看到,Page類就是一個HttpHandler。
綜上整個過程就是:當客戶端向服務器發(fā)送資源請求時,請求首先到達IIS的HTTP.SYS。然后HTTP.SYS發(fā)送請求道對應的Application Pool。 然后Application Pool發(fā)送請求到Worker Process(W3WP.exe)中加載ISAPI Extension,ISAPI創(chuàng)建一個HttpRuntime對象來通過HttpModule和HttpHandler處理請求。 然后頁面生命周期就開始了。
4, 頁面生命周期開始
頁面生命周期的主要階段包括:
頁面初始化(Init): 服務器創(chuàng)建服務器控件的實例
加載(load): 控件實例被加載到它定義的頁面對象中
預輸出:(PreRender) 對控件的更改被更新,準備輸出。
保存(SaveViewState): 控件的狀態(tài)信息被保存。
輸出頁面(Render):服務器為控件創(chuàng)建html標記。
處理(Dispose): 主要做的工作就是dispose, 關閉數(shù)據(jù)庫連接,文件資源的釋放等。
卸載(Unload):銷毀服務器控件的實例
頁面生命周期的主要事件:
PreInit:
1.檢查IsPostBack 屬性
2.動態(tài)設置Master Page
3.動態(tài)設置Theme
4.設置控件的默認值(UniqueId等)
5.重新創(chuàng)建動態(tài)控件(初始化控件),初始化控件的值
Init: 這個事件發(fā)生在所有的控件被初始化,所有的皮膚設置被應用以后。它用來讀取或者初始化控件屬性。它能夠用來注冊一些aspx頁面中沒有指出的控件的事件。
InitComplete: Use this event for processing tasks that require all initialization to be complete.
PreLoad: 加載頁面的ViewState和所有的控件,然后處理所有的包含在Request實例中的postback數(shù)據(jù)。
Load: 這個事件可能是大家最熟悉的了。需要注意的是,Page對象會遞歸的調(diào)用子控件的onload事件直到頁面和所有的子控件被加載完成。這個事件主要用來設置控件屬性的值,建立數(shù)據(jù)庫連接(通常不這么做)。
Control events: 這個就不多說了,主要是處理控件的事件,例如click。這也就讓我們明白了每次我們click一個Button的時候,實際上是要先去執(zhí)行l(wèi)oad事件然后才執(zhí)行click事件的,一般我們用!IsPostBack來判斷一下從而避免執(zhí)行不必要的加載邏輯。
LoadComplete: 頁面所有的控件都被加載以后執(zhí)行,暫時沒有想到用來干什么。。。
PreRender: 在HTML被生成之前這是最后一個事件。每一個頁面中的控件都有PreRender的過程。在這里對將要輸出的HTML結(jié)果進行最后一次修改。
SaveStateComplete: 在這個時間發(fā)生之前,已經(jīng)保存了所有控件和頁面的,任何對page或者控件的改動都不會產(chǎn)生左右。暫時沒想到用來干啥。
Render: 它不是一個事件而是一個方法。工作就是把HTML寫回客戶端瀏覽器。
UnLoad: 頁面中的每一個控件都會發(fā)生這件事。在控件中,使用這個事件來做清理工作,例如關閉數(shù)據(jù)庫連接等。對與頁面本身也是做清理工作,例如關閉打開的文件和數(shù)據(jù)庫連接,或者結(jié)束日志或者其它指定的工作。
需要說明的是,每次Request都會創(chuàng)建一個全新的Page類的實例,所以在頁面中的自己定義的字段是不能在兩次request中傳遞值的,需要使用viewstate來存儲。
5, HttpHandler根據(jù)頁面生命周期中事件的處理把結(jié)果發(fā)回IIS,IIS再把結(jié)果發(fā)回客戶端瀏覽器。
值得注意的是,在這個過程中請求會再次通過HttpModule(注冊一個EndRequest事件)。
至此,整個Request結(jié)束。

相關文章

  • 簡單Web service 身份驗證解決方案

    簡單Web service 身份驗證解決方案

    問題提出:為了構(gòu)建一個安全的web服務,需要對調(diào)用方進行身份驗證,只讓通過審核的用戶調(diào)用web服務。
    2009-05-05
  • .net 刷新頁面后彈出重試框的解決方法

    .net 刷新頁面后彈出重試框的解決方法

    關閉模式窗口后,需要刷新父頁面,但是模式窗口關閉后,父頁面總是會彈出重試消息框,遇到此問題的朋友看下解決方法哈
    2013-04-04
  • ASP.NET?MVC從控制器中獲取URL值

    ASP.NET?MVC從控制器中獲取URL值

    這篇文章介紹了ASP.NET?MVC從控制器中獲取URL值的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • ASP.NET XmlHttp跨域訪問實現(xiàn)代碼

    ASP.NET XmlHttp跨域訪問實現(xiàn)代碼

    最近項目需要實現(xiàn)XmlHttp的POST方法到另一服務器上的頁面進行數(shù)據(jù)的更新,可是IE會提出“該頁正在訪問其控制范圍之外的信息,是否繼續(xù)?”等警告信息,而在其他瀏覽器上直接禁止掉,GOOGLE一下原來是XmlHttp的跨域訪問問題,找了很多資料,說是提供很多解決方案,可是都沒有用處。
    2008-11-11
  • ASP.NET數(shù)據(jù)綁定之Repeater控件

    ASP.NET數(shù)據(jù)綁定之Repeater控件

    這篇文章主要介紹了ASP.NET數(shù)據(jù)綁定中的Repeater控件,Repeater控件可以將數(shù)據(jù)庫中的信息加以綁定然后再在瀏覽器中顯示出來,感興趣的小伙伴們可以參考一下
    2016-01-01
  • ASP.NET 頁面間數(shù)據(jù)傳遞方法小結(jié)

    ASP.NET 頁面間數(shù)據(jù)傳遞方法小結(jié)

    Web 頁面是無狀態(tài)的, 服務器對每一次請求都認為來自不同用戶,因此,變量的狀態(tài)在連續(xù)對同一頁面的多次請求之間或在頁面跳轉(zhuǎn)時不會被保留。
    2009-12-12
  • 在IIS上重新注冊.NET Framework 2.0的命令和參數(shù)詳解

    在IIS上重新注冊.NET Framework 2.0的命令和參數(shù)詳解

    這篇文章主要介紹了在IIS上重新注冊.NET Framework 2.0的命令和參數(shù)詳解,但其它.NET Framework 版本沒有測試,需要的朋友可以參考下
    2014-07-07
  • ASP.NET?MVC實現(xiàn)單個圖片上傳、限制圖片格式與大小并在服務端裁剪圖片

    ASP.NET?MVC實現(xiàn)單個圖片上傳、限制圖片格式與大小并在服務端裁剪圖片

    這篇文章介紹了ASP.NET?MVC實現(xiàn)單個圖片上傳、限制圖片格式與大小并在服務端裁剪圖片的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • .NET?Core使用Eureka實現(xiàn)服務注冊

    .NET?Core使用Eureka實現(xiàn)服務注冊

    這篇文章介紹了.NET?Core使用Eureka實現(xiàn)服務注冊的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • ASP.NET Core項目中集成TypeScript

    ASP.NET Core項目中集成TypeScript

    這篇文章介紹了ASP.NET Core項目中集成TypeScript的方法,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07

最新評論

靖西县| 樟树市| 汤阴县| 江永县| 志丹县| 措勤县| 日土县| 松阳县| 两当县| 济阳县| 津南区| 连州市| 青河县| 长岛县| 镇康县| 治多县| 博野县| 石门县| 华坪县| 沙河市| 五峰| 罗源县| 澄江县| 枣庄市| 宜都市| 平舆县| 临泽县| 承德市| 响水县| 南城县| 成都市| 河南省| 葫芦岛市| 墨玉县| 长垣县| 普安县| 四会市| 南乐县| 和田县| 乐平市| 墨玉县|