中文字幕日韩一区二区_国产一区二区av_国产毛片av_久久久久国产一区_色婷婷电影_国产一区二区精品

ASP.NET 請求處理流程

  HTTP處理流程圖

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

  1.http.sys

  是一個(gè)位于Win2003和WinXP SP2中的操作系統(tǒng)核心組件,能夠讓任何應(yīng)用程序通過它提供的接口,以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)并沒有真的使用這個(gè)內(nèi)核級(jí)驅(qū)動(dòng),而XP上自帶的IIS 5.1也沒有使用HTTP API。

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

  新的Http.sys帶來的好處大致有如下一些:

  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ù)請求會(huì)在Http.sys里暫存入隊(duì)列,而不是由服務(wù)程序本身來處理,這樣,即使服務(wù)程序重啟,尚未被處理的請求也不會(huì)丟失了

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

  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)生的問題的影響。 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)站,選擇“屬性”,打開屬性對話框。在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ù))接收它們的請求,所以性能和可靠性得到了增強(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管理器中,打開本地計(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)用程序池作為模板”,請?jiān)?ldquo;應(yīng)用程序池名稱”框中右鍵單擊想要用來作為模板的應(yīng)用程序池。最后單擊[確定]。
指派應(yīng)用程序池
  在 IIS 管理器中,右鍵單擊您要為其指派應(yīng)用程序池的應(yīng)用程序,然后單擊“屬性”。 單擊“主目錄”選項(xiàng)卡,確認(rèn)您正在指派的目錄或虛擬目錄的“應(yīng)用程序名”是否已被填寫。如果“應(yīng)用程序名”框尚未被填寫,請單擊“創(chuàng)建”,然后輸入名稱。
  在“應(yīng)用程序池”列表框中,選擇您想要為其指派的應(yīng)用程序池的名稱。最后單擊[確定]。

   3.ASPNET_isapi.dll

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

  這個(gè)DLL是ASP.NET底層的一個(gè)類庫,這是它的介紹: 當(dāng)客戶端向web服務(wù)器請求一個(gè)*.ASPx的頁面文件時(shí),同ASP類似,這個(gè)http請求也會(huì)被iNETinfo.exe進(jìn)程截獲(www服務(wù)),它判斷文件后綴之后,把這個(gè)請求轉(zhuǎn)交給ASPNET_ISAPI.DLL而ASPNET_ISAPI.DLL則會(huì)通過一個(gè)Http PipeLine的管道,將這個(gè)http請求發(fā)送給ASPNET_WP.EXE進(jìn)程,當(dāng)這個(gè)HTTP請求進(jìn)入ASPNET_WP.EXE進(jìn)程之后,ASP.NET framework就會(huì)通過HttpRuntime來處理這個(gè)Http請求,處理完畢后將結(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 托管代碼用于處理請求的基本輔助方法和枚舉)對象。

 

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

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


   初始化所有核心應(yīng)用程序?qū)ο笾?,將通過創(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請求都會(huì)有一個(gè)HttpApplication類型的對象來管理這次請求的過程。

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

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

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

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

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

 

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

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

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

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

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

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

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

  要區(qū)分開HttpApplication和HttpApplicationState

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

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

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

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

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

 

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

  1. 對請求進(jìn)行驗(yàn)證,將檢查瀏覽器發(fā)送的信息,并確定其是否包含潛在惡意標(biāo)記。有關(guā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ù)所請求資源的文件擴(kuò)展名(在應(yīng)用程序的配置文件中映射),選擇實(shí)現(xiàn) IHttpHandler 的類,對請求進(jìn)行處理。如果該請求針對從 Page 類派生的對象(頁),并且需要對該頁進(jìn)行編譯,則 ASP.NET 會(huì)在創(chuàng)建該頁的實(shí)例之前對其進(jìn)行編譯。

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

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

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

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

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

  16. 引發(fā) PostRequestHandlerExecute 事件。(在HTTP請求送入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 事件。

  其他

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

  如果文件擴(kuò)展名尚未映射到 ASP.NET,則 ASP.NET 將不會(huì)接收該請求。對于使用 ASP.NET 身份驗(yàn)證的應(yīng)用程序,理解這一點(diǎn)非常重要。例如,由于 .htm 文件通常沒有映射到 ASP.NET,因此 ASP.NET 將不會(huì)對 .htm 文件請求執(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 文件中注冊該處理程序。有關(guān)更多信息,請參見 HTTP 處理程序介紹。

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

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

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

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

主站蜘蛛池模板: 欧美日韩成人在线观看 | 久久久国产一区二区三区 | 亚洲欧美日韩在线 | aaa一区| 国产激情99| 在线看91 | 97久久久久久久久 | 国产在线精品一区二区三区 | 亚洲欧美日韩高清 | 久久久高清 | 婷婷色国产偷v国产偷v小说 | 岛国av一区二区三区 | 1000部精品久久久久久久久 | 91免费在线播放 | 精品国产三级 | a在线观看 | 国产99热精品| 国产一在线观看 | 超碰在线网站 | 欧美激情综合五月色丁香小说 | 久久天堂 | 在线91 | 黑人性hd | 国产精品一区二区久久久久 | 国产视频精品区 | 国产永久免费 | 我想看一级黄色毛片 | av一区在线 | 欧美成人高清视频 | 国产日韩精品在线 | 午夜精品久久久 | 久久精品二区 | a视频在线观看 | 国产精品美女久久久久 | 国产成人精品高清久久 | 性高湖久久久久久久久 | 欧美小视频在线观看 | 欧美日韩最新 | 国产精品1区 | 中文字幕在线三区 | 欧美精品在线观看 |