一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

ASP.NET 請(qǐng)求處理流程

  HTTP處理流程圖

  以上流程的一些概念解釋:

  1.http.sys

  是一個(gè)位于Win2003和WinXP SP2中的操作系統(tǒng)核心組件,能夠讓任何應(yīng)用程序通過(guò)它提供的接口,以http協(xié)議進(jìn)行信息通訊。

  溫馨提示:如果用戶不慎刪除了該驅(qū)動(dòng)文件,不用擔(dān)心,該驅(qū)動(dòng)會(huì)在下次系統(tǒng)啟動(dòng)時(shí)重建。是一個(gè)刪不掉的系統(tǒng)核心組件!實(shí)用程序結(jié)束該驅(qū)動(dòng),該驅(qū)動(dòng)也會(huì)馬上重新創(chuàng)建(只有粉碎文件才不能馬上重建,但粉碎后,下次啟動(dòng)會(huì)重建)。

  微軟在Windows 2003 Server里引進(jìn)了新的HTTP API和kernel mode driver Http.sys,目的是使基于Http服務(wù)的程序更有效率。這個(gè)改變的直接收益者就是IIS 6.0和ASP.NET

  其實(shí)在Windows XP安裝SP2后,Http.sys已經(jīng)出現(xiàn)在系統(tǒng)里了,但事實(shí)上,操作系統(tǒng)并沒(méi)有真的使用這個(gè)內(nèi)核級(jí)驅(qū)動(dòng),而XP上自帶的IIS 5.1也沒(méi)有使用HTTP API。

  新的HTTP API里最核心的變化都封裝在Http.sys這個(gè)kernel mode driver里了。在此之前,基于HTTP協(xié)議的程序都是在User mode下運(yùn)行的,而且必須自己處理諸如軟件中斷、context switch、線程調(diào)度等等問(wèn)題,并且往往無(wú)法自由接觸系統(tǒng)資源。過(guò)去,HTTP服務(wù)器,如IIS, Apache等都是利用Winsock API來(lái)創(chuàng)建一個(gè)User mode下的NETwork listener。NETwork listener通常獨(dú)自(i.e.: per application or per thread basis)占用一個(gè)IP端口。通俗點(diǎn)說(shuō),就是在同一時(shí)間只有一個(gè)應(yīng)用程序可以監(jiān)聽(tīng)一個(gè)端口,這在有些時(shí)候是一個(gè)不太令人舒服的限制。

  新的Http.sys帶來(lái)的好處大致有如下一些:

  1. 緩存 - 靜態(tài)的內(nèi)容現(xiàn)在被緩存于內(nèi)核模式下,這使服務(wù)響應(yīng)速度更快

  2. 記錄 (Log)-IIS的log功能更快且標(biāo)準(zhǔn)化了

  3. 帶寬控制 - greater Scalability control and throttling

  4. 可靠性 - 所有的服務(wù)請(qǐng)求會(huì)在Http.sys里暫存入隊(duì)列,而不是由服務(wù)程序本身來(lái)處理,這樣,即使服務(wù)程序重啟,尚未被處理的請(qǐng)求也不會(huì)丟失了

  5. IP端口重用 - 現(xiàn)在,只要是通過(guò)Http.sys管理的端口(基本包括了那些著名的端口,比如80),都可以同時(shí)允許多個(gè)程序同時(shí)監(jiān)聽(tīng)了。

  2.應(yīng)用程序池

  應(yīng)用池即應(yīng)用程序池:
  在Microsoft IIS6中引入了應(yīng)用程序池,這是微軟的一個(gè)全新概念:應(yīng)用程序池是將一個(gè)或多個(gè)應(yīng)用程序鏈接到一個(gè)或多個(gè)工作進(jìn)程集合的配置。因?yàn)?a href=/pingce/yingyong/ target=_blank class=infotextkey>應(yīng)用程序池中的應(yīng)用程序與其他應(yīng)用程序被工作進(jìn)程邊界分隔,所以某個(gè)應(yīng)用程序池中的應(yīng)用程序不會(huì)受到其他應(yīng)用程序池中應(yīng)用程序所產(chǎn)生的問(wèn)題的影響。 Windows 2003同時(shí)支持兩種工作模式,默認(rèn)為ISS 6.0工作進(jìn)程隔離模式。工作進(jìn)程隔離模式防止一個(gè)應(yīng)用程序或站點(diǎn)停止了而影響另一個(gè)應(yīng)用程序或站點(diǎn),大大增強(qiáng)了IIS的可靠性。那么如何設(shè)置兩種工作模式呢?
  啟動(dòng)IIS管理器,右擊網(wǎng)站,選擇“屬性”,打開(kāi)屬性對(duì)話框。在IIS 6.0工作進(jìn)程隔離模式下,所有的應(yīng)用程序代碼都在隔離環(huán)境中運(yùn)行,它們是如何進(jìn)行隔離的呢?Windows 2003新增了應(yīng)用程序池,工作進(jìn)程隔離模式允許客戶創(chuàng)建多個(gè)應(yīng)用程序池,每個(gè)應(yīng)用程序池都可以有不同的配置。因?yàn)檫@些應(yīng)用程序池直接從內(nèi)核(而非WWW 服務(wù))接收它們的請(qǐng)求,所以性能和可靠性得到了增強(qiáng)。要隔離運(yùn)行在同一臺(tái)計(jì)算機(jī)上但屬于不同網(wǎng)站的Web應(yīng)用程序,需要為每個(gè)網(wǎng)站創(chuàng)建單獨(dú)的應(yīng)用程序池。
創(chuàng)建應(yīng)用程序池
  在IIS管理器中,打開(kāi)本地計(jì)算機(jī),右鍵單擊“應(yīng)用程序池”,選擇新建“應(yīng)用程序池” (必須在工作進(jìn)程隔離模式下才能建立應(yīng)用程序池) 。“應(yīng)用程序池名稱”框中,輸入新的應(yīng)用程序池名稱。如果在“應(yīng)用程序池 ID”框中出現(xiàn)的 ID (如:AppPool #1)不是您想要的,可進(jìn)行重命名。如果您單擊了“將現(xiàn)有應(yīng)用程序池作為模板”,請(qǐng)?jiān)?ldquo;應(yīng)用程序池名稱”框中右鍵單擊想要用來(lái)作為模板的應(yīng)用程序池。最后單擊[確定]。
指派應(yīng)用程序池
  在 IIS 管理器中,右鍵單擊您要為其指派應(yīng)用程序池的應(yīng)用程序,然后單擊“屬性”。 單擊“主目錄”選項(xiàng)卡,確認(rèn)您正在指派的目錄或虛擬目錄的“應(yīng)用程序名”是否已被填寫(xiě)。如果“應(yīng)用程序名”框尚未被填寫(xiě),請(qǐng)單擊“創(chuàng)建”,然后輸入名稱。
  在“應(yīng)用程序池”列表框中,選擇您想要為其指派的應(yīng)用程序池的名稱。最后單擊[確定]。

   3.ASPNET_isapi.dll

  這個(gè)文件是ASP.NET的處理文件,用于處理ASP.NET在iis中注冊(cè)過(guò)擴(kuò)展名的文件比如默認(rèn)的.ASPx文件注冊(cè)到ASPNET_isapi.dll,這樣用戶訪問(wèn).ASPx文件時(shí),服務(wù)器自動(dòng)調(diào)用ASPNET_isapi.dll來(lái)處理這個(gè)文件.

  這個(gè)DLL是ASP.NET底層的一個(gè)類庫(kù),這是它的介紹: 當(dāng)客戶端向web服務(wù)器請(qǐng)求一個(gè)*.ASPx的頁(yè)面文件時(shí),同ASP類似,這個(gè)http請(qǐng)求也會(huì)被iNETinfo.exe進(jìn)程截獲(www服務(wù)),它判斷文件后綴之后,把這個(gè)請(qǐng)求轉(zhuǎn)交給ASPNET_ISAPI.DLL而ASPNET_ISAPI.DLL則會(huì)通過(guò)一個(gè)Http PipeLine的管道,將這個(gè)http請(qǐng)求發(fā)送給ASPNET_WP.EXE進(jìn)程,當(dāng)這個(gè)HTTP請(qǐng)求進(jìn)入ASPNET_WP.EXE進(jìn)程之后,ASP.NET framework就會(huì)通過(guò)HttpRuntime來(lái)處理這個(gè)Http請(qǐng)求,處理完畢后將結(jié)果返回給客戶端。

  4.CLR

  http://developer.51cto.com/art/200910/158022.htm

  http://developer.51cto.com/art/200909/152551.htm

  5.AppDomain

  http://www.cnblogs.com/chorrysky/archive/2008/07/16/1244089.html

  6.ISAPIRuntime

  管理 .NET Framework 中的 HttpWorkerRequest (此抽象類定義由 ASP.NET 托管代碼用于處理請(qǐng)求的基本輔助方法和枚舉)對(duì)象。

 

-----------------------------------------------------------------------------------------------------------------------------

  當(dāng)?shù)谝粋€(gè)請(qǐng)求到達(dá)時(shí)的動(dòng)作如下圖所示:


   初始化所有核心應(yīng)用程序?qū)ο笾螅瑢⑼ㄟ^(guò)創(chuàng)建 HttpApplication 類的實(shí)例啟動(dòng)應(yīng)用程序。如果應(yīng)用程序具有 Global.asax 文件,則 ASP.NET 會(huì)創(chuàng)建 Global.asax 類(從 HttpApplication 類派生)的一個(gè)實(shí)例,并使用該派生類表示應(yīng)用程序。

  每次http請(qǐng)求都會(huì)有一個(gè)HttpApplication類型的對(duì)象來(lái)管理這次請(qǐng)求的過(guò)程。

  為每次http請(qǐng)求創(chuàng)建一個(gè)HttpContext對(duì)象,此對(duì)象在整個(gè)Http處理過(guò)程中都是可訪問(wèn)的。

  HttpApplication對(duì)象負(fù)責(zé)裝配出整個(gè)“HTTP請(qǐng)求處理管線(HTTP Pipeline)”,這相當(dāng)于一條加工流水線,讓HttpContext對(duì)象在這條線上過(guò)一遍。

  HttpContext對(duì)象經(jīng)過(guò)流水線的不同部分時(shí),HttpApplication對(duì)象會(huì)先后激發(fā)出一連串的事件。HTTP模塊(HTTP Module)可以響應(yīng)這些事件,在此事件響應(yīng)代碼中可以對(duì)HttpContext對(duì)象進(jìn)行“加工和處理”。

  HTTP模塊可以看成是“生產(chǎn)流水線”中的工人。

  HTTP模塊對(duì)象是在HttpApplication對(duì)象的InitModules()方法中被創(chuàng)建的,創(chuàng)建時(shí)會(huì)調(diào)用其init方法,我們一般在HTTP模塊對(duì)象Init()方法中書(shū)寫(xiě)代碼對(duì)HttpApplication對(duì)象的事件進(jìn)行注冊(cè)。

 

  在流水線的中部(處理完了相關(guān)的事件),HttpContext對(duì)象被最終的Page對(duì)象所接收(這就是為何可以在ASP.NET頁(yè)面中通過(guò)Page類定義的Context屬性訪問(wèn)HttpContext對(duì)象的原因)。

  每個(gè)被訪問(wèn)的ASP.NET頁(yè)面都會(huì)被轉(zhuǎn)換為一個(gè)“派生自Page類的頁(yè)面類”

  Page類實(shí)現(xiàn)了IHttpHandler接口,此接口定義了一個(gè)ProcessRequest()方法。

  ASP.NET頁(yè)面類生成以后被自動(dòng)編譯為程序集,然后其ProcessRequest()方法被自動(dòng)調(diào)用。ProcessRequest()方法的執(zhí)行結(jié)果再次被HttpContext對(duì)象所承載,控制又轉(zhuǎn)回到“HTTP請(qǐng)求處理流水線”中,HttpApplication對(duì)象繼續(xù)激發(fā)后繼的事件。這時(shí),如果還有特定的HTTP模塊響應(yīng)這些事件,則它們會(huì)被自動(dòng)調(diào)用。

  HttpContext對(duì)象帶著最后的處理結(jié)果來(lái)到了“HTTP請(qǐng)求處理管線”的未端,其信息被取出來(lái),再次以ASPNET_isapi.dll為橋梁傳送給工作者進(jìn)程。工作者進(jìn)程再將HTTP請(qǐng)求的處理結(jié)果轉(zhuǎn)給HTTP.SYS,由它負(fù)責(zé)將結(jié)果返回給瀏覽器。

我們所寫(xiě)的那些頁(yè)面代碼,以及那一套復(fù)雜的頁(yè)面生命周期,都是整個(gè)ASP.NET周期中的一部分,所有IhttpHandler的操作,都是在Application的PreRequestHandlerExecute 事件和PostRequestHandlerExecute 事件之間完成的,IHttpHandler中的操作都是頁(yè)面級(jí)別的操作,他們不能跨出頁(yè)面這個(gè)范。

  在應(yīng)用程序級(jí)別的操作,應(yīng)該使用IHttpModule。

  要區(qū)分開(kāi)HttpApplication和HttpApplicationState

  HttpApplicationState是整個(gè)應(yīng)用程序唯一的。
  而HttpApplication則不是唯一的。

  你在頁(yè)面中寫(xiě)的Application[“key”] = “”value; 這個(gè)Application其實(shí)是HttpApplicationState

  每一次請(qǐng)求都由一個(gè)HttpApplication對(duì)象來(lái)處理,在處理過(guò)程中,這個(gè)對(duì)象不能再處理其他請(qǐng)求,并發(fā)訪問(wèn)時(shí),會(huì)為不同訪問(wèn)分配不同HttpApplication對(duì)象。

  HttpApplicationFactory對(duì)象負(fù)責(zé)管理一個(gè)HttpApplication對(duì)象池,當(dāng)有HTTP請(qǐng)求到來(lái)時(shí),如果池中還有可用的   HttpApplication對(duì)象,則分配之,否則,創(chuàng)建一個(gè)新的HttpApplication對(duì)象。請(qǐng)求完畢后,HttpApplication會(huì)被回收以供再次使用。

  每當(dāng)新的HttpApplication對(duì)象創(chuàng)建時(shí),都會(huì)根據(jù)配置創(chuàng)建新的Ihttpmodule對(duì)象,新的IHttpModule對(duì)象被創(chuàng)建時(shí),其init方法就會(huì)被執(zhí)行。

 

  HttpApplication在不同處理階段觸發(fā)的事件列表

  1. 對(duì)請(qǐng)求進(jìn)行驗(yàn)證,將檢查瀏覽器發(fā)送的信息,并確定其是否包含潛在惡意標(biāo)記。有關(guān)更多信息,請(qǐng)參見(jiàn) ValidateRequest腳本侵入概述

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

  3. 引發(fā) BeginRequest 事件。

  4. 引發(fā) AuthenticateRequest 事件。

  5. 引發(fā) PostAuthenticateRequest 事件。

  6. 引發(fā) AuthorizeRequest 事件。

  7. 引發(fā) PostAuthorizeRequest 事件。

  8. 引發(fā) ResolveRequestCache 事件。

  9. 引發(fā) PostResolveRequestCache 事件。

  10. 根據(jù)所請(qǐng)求資源的文件擴(kuò)展名(在應(yīng)用程序的配置文件中映射),選擇實(shí)現(xiàn) IHttpHandler 的類,對(duì)請(qǐng)求進(jìn)行處理。如果該請(qǐng)求針對(duì)從 Page 類派生的對(duì)象(頁(yè)),并且需要對(duì)該頁(yè)進(jìn)行編譯,則 ASP.NET 會(huì)在創(chuàng)建該頁(yè)的實(shí)例之前對(duì)其進(jìn)行編譯。

  11. 引發(fā) PostMapRequestHandler 事件。

  12. 引發(fā) AcquireRequestState 事件。(加載初始化Session時(shí)候觸發(fā))

  13. 引發(fā) PostAcquireRequestState 事件。

  14. 引發(fā) PreRequestHandlerExecute 事件。(在HTTP請(qǐng)求送入HttpHandler之前觸發(fā))

  15. 為該請(qǐng)求調(diào)用合適的 IHttpHandler 類的 ProcessRequest 方法(或異步版 BeginProcessRequest)。例如,如果該請(qǐng)求針對(duì)某頁(yè),則當(dāng)前的頁(yè)實(shí)例將處理該請(qǐng)求。

  16. 引發(fā) PostRequestHandlerExecute 事件。(在HTTP請(qǐng)求送入HttpHandler之后觸發(fā))

  17. 引發(fā) ReleaseRequestState 事件。(存儲(chǔ)Session狀態(tài)的時(shí)候觸發(fā))

  18. 引發(fā) PostReleaseRequestState 事件。

  19. 如果定義了 Filter 屬性,則執(zhí)行響應(yīng)篩選。

  20. 引發(fā) UpdateRequestCache 事件。(更新緩存信息的時(shí)候觸發(fā))

  21. 引發(fā) PostUpdateRequestCache 事件。

  22. 引發(fā) EndRequest 事件。

  其他

  通過(guò)使用命名約定 Application_event(如 Application_BeginRequest),ASP.NET 可在 Global.asax 文件中將應(yīng)用程序事件自動(dòng)綁定到處理程序。這與將 ASP.NET 頁(yè)方法自動(dòng)綁定到事件(如頁(yè)的 Page_Load 事件)的方法類似。

  如果文件擴(kuò)展名尚未映射到 ASP.NET,則 ASP.NET 將不會(huì)接收該請(qǐng)求。對(duì)于使用 ASP.NET 身份驗(yàn)證的應(yīng)用程序,理解這一點(diǎn)非常重要。例如,由于 .htm 文件通常沒(méi)有映射到 ASP.NET,因此 ASP.NET 將不會(huì)對(duì) .htm 文件請(qǐng)求執(zhí)行身份驗(yàn)證或授權(quán)檢查。因此,即使文件僅包含靜態(tài)內(nèi)容,如果希望 ASP.NET 檢查身份驗(yàn)證,也應(yīng)使用映射到 ASP.NET 的文件擴(kuò)展名創(chuàng)建該文件,如采用文件擴(kuò)展名 .ASPx。

  如果要?jiǎng)?chuàng)建服務(wù)于特定文件擴(kuò)展名的自定義處理程序,必須在 IIS 中將該擴(kuò)展名映射到 ASP.NET,還必須在應(yīng)用程序的 Web.config 文件中注冊(cè)該處理程序。有關(guān)更多信息,請(qǐng)參見(jiàn) HTTP 處理程序介紹

  在AcquireRequestState事件(包含該事件) 到 PostRequestHandlerExecute事件(不包含該事件)之前這段時(shí)間里,Session都是可用的。Httphandler的ProcessRequest方法也是在這段時(shí)間內(nèi)被調(diào)用的,所以用在頁(yè)面中可以用Session[“key”]來(lái)訪問(wèn)Session。

  其他參考:http://www.cnblogs.com/stg609/articles/1224943.html

NET技術(shù)ASP.NET 請(qǐng)求處理流程,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 亚洲网站在线 | 国内久久久久影院精品 | 91精品91久久久 | 色婷婷一区二区三区四区成人网 | 香港三级午夜理伦三级99 | 国产成人福利精品视频 | 一区二区不卡在线观看 | 欧美黄色片免费观看 | 人人爰人人人人人鲁 | 精品久久久久久国产 | 日本免费一区二区三区看片 | 最新国产在线观看福利91 | 美女激情网 | 一区二区视频在线播放 | 亚洲精品影院 | 国产欧美日韩不卡一区二区三区 | 亚洲图片激情小说 | 国产怡红院 | 尹人久久大香找蕉综合影院 | 道区二区三区四区 | 美女大胸又爽又黄网站 | 国产精品免费观看视频 | 成人中文字幕一区二区三区 | 亚洲精品永久www嫩草 | 日韩久久久精品中文字幕 | 亚洲人成人毛片无遮挡 | a级成人毛片久久 | 色综合久久九月婷婷色综合 | 精品视频在线一区 | 91精品91久久久久久 | 亚色影视| 老司机日日摸夜夜摸精品影院 | 国产精品国产三级国产专不∫ | 亚洲欧洲成人 | 91久久香蕉青青草原娱乐 | 小视频国产 | 韩国欧洲一级毛片免费 | 美女激情网 | 一级做a爰片久久毛片美女 一级做a爰片久久毛片人呢 | 国产精品原创视频 | 免费看一级淫片成人 |