色尼玛亚洲综合影院,亚洲3atv精品一区二区三区,麻豆freexxxx性91精品,欧美在线91

HttpApplication的認(rèn)識(shí)與加深理解

  HttpApplication對(duì)象是經(jīng)由HttpApplicationFactory.GetApplicationInstance(并最終調(diào)用HttpRuntime.CreateNonPublicInstance)創(chuàng)建的HttpApplicationFactory它的主要任務(wù)是使用 URL 信息來(lái)查找 URL 虛擬目錄和匯集的 HttpApplication 對(duì)象之間的匹配關(guān)系。

  這個(gè)工廠類的行為概括為有以下幾點(diǎn)

  1、工廠類維護(hù), HttpApplication 對(duì)象池并使用它們來(lái)處理應(yīng)用程序的請(qǐng)求。池的壽命與應(yīng)用程序的壽命相同。

  2、應(yīng)用程序的第一個(gè)請(qǐng)求到達(dá)時(shí),工廠類提取有關(guān)應(yīng)用程序類型的信息(global.asax 類)、設(shè)置用于監(jiān)視更改的文件、創(chuàng)建應(yīng)用程序狀態(tài)并觸發(fā) Application_OnStart 事件。工廠類從池中獲取一個(gè) HttpApplication 實(shí)例,并將要處理的請(qǐng)求放入實(shí)例中。如果沒(méi)有可用的對(duì)象,則創(chuàng)建一個(gè)新的 HttpApplication 對(duì)象。要?jiǎng)?chuàng)建 HttpApplication 對(duì)象,需要先完成 global.asax 應(yīng)用程序文件的編譯。

  3、HttpApplication 開(kāi)始處理請(qǐng)求,并且只能在完成這個(gè)請(qǐng)求后才能處理新的請(qǐng)求。如果收到來(lái)自同一資源的新請(qǐng)求,則由池中的其他對(duì)象來(lái)處理。

  4、應(yīng)用程序?qū)ο笤试S所有注冊(cè)的 HTTP 模塊對(duì)請(qǐng)求進(jìn)行預(yù)處理,并找出最適合處理請(qǐng)求的處理程序類型。這通過(guò)查找請(qǐng)求的 URL 的擴(kuò)展和配置文件中的信息來(lái)完成。

  HttpApplicationFactory.GetApplicationInstance創(chuàng)建HttpApplication實(shí)例中有三個(gè)關(guān)鍵方法:

  HttpApplicationFactory._theApplicationFactory.EnsureInited()  該方法檢查HttpApplicationFactory是否被初始化,如果沒(méi)有,就通過(guò)HttpApplicationFactory.Init()進(jìn)行初始化。在Init()中,先獲取global.asax文件的完整路徑,然后調(diào)用CompileApplication()對(duì)global.asax進(jìn)行編譯。

HttpApplicationFactory._theApplicationFactory.EnsureAppStartCalled(context)  創(chuàng)建特定的HttpApplication實(shí)例,觸發(fā)ApplicationOnStart事件,執(zhí)行ASP.global_asax中的Application_Start(object sender, EventArgs e)方法。這里創(chuàng)建的HttpApplication實(shí)例在處理完事件后,就被回收。

  HttpApplicationFactory._theApplicationFactory.GetNormalApplicationInstance(context) 該方法創(chuàng)建HttpApplication實(shí)例并進(jìn)行初始化,調(diào)用System.Web.HttpApplication.InitInternal()方法。創(chuàng)建HttpApplication實(shí)例是根據(jù)實(shí)際的_theApplicationType進(jìn)行創(chuàng)建。如果Web目錄中沒(méi)有g(shù)lobal.asa文件,也就是說(shuō)沒(méi)有動(dòng)態(tài)編譯生成ASP.global_asax類型,那就直接實(shí)例化  HttpApplication。如果創(chuàng)建了ASP.global_asax類型,那就對(duì)ASP.global_asa進(jìn)行實(shí)例化。

  創(chuàng)建HttpApplication實(shí)例之后就是調(diào)用實(shí)例的InitInternal方法。
  InitInternal方法的主要功能如下:
    1. InitModules():根據(jù)Web.Config的設(shè)置,創(chuàng)建相應(yīng)的HttpModules。

    2. HookupEventHandlersForAppplicationAndModules:根據(jù)發(fā)生的事件,調(diào)用HttpApplication實(shí)例中相應(yīng)的事件處理函數(shù)。

  3. 創(chuàng)建很多實(shí)現(xiàn)IExecutionStep接口的類的實(shí)例并添加到當(dāng)前HttpApplication實(shí)例的_execSteps中,等待回調(diào)時(shí)執(zhí)行。從這里我們可以看到HttpApplication是以異步的方式處理請(qǐng)求, 對(duì)請(qǐng)求的很多處理工作都放入了_execStep等待回調(diào)時(shí)執(zhí)行。

     _execStep中主要的處理工作如下:
    1) 對(duì)請(qǐng)求的路徑進(jìn)行安全檢查,禁止非法路徑訪問(wèn)(ValidatePathExecutionStep)。
    2) 如果設(shè)置了UrlMappings, 進(jìn)行RewritePath(UrlMappingsExecutionStep)。
    3) 執(zhí)行事件處理函數(shù),比如:BeginRequest、AuthenticateRequest等等。

  下面就是獲取處理當(dāng)前請(qǐng)求的HttpHandler,ASP.NET頁(yè)面的動(dòng)態(tài)編譯也是在這里進(jìn)行的。至此HttpApplication流程將會(huì)轉(zhuǎn)到HttpHandler流程.也就是說(shuō)HttpApplication 對(duì)象負(fù)責(zé)查找應(yīng)該使用哪種處理程序來(lái)處理請(qǐng)求。HttpApplication 對(duì)象還負(fù)責(zé)檢測(cè)對(duì)動(dòng)態(tài)創(chuàng)建的、表示資源的程序集(如 .ASPx 頁(yè)面或 .asmx Web 服務(wù))所進(jìn)行的更改。如果檢測(cè)到更改,應(yīng)用程序?qū)ο髮⒋_保編譯并加載所請(qǐng)求的資源的最新來(lái)源。HttpApplication調(diào)用ProcessRequest方法來(lái)處理用戶請(qǐng)求,此方法會(huì)調(diào)用對(duì)應(yīng)的HttpHandler來(lái)處理用戶請(qǐng)求,HttpHandler根據(jù)用戶請(qǐng)求的文件的擴(kuò)展名處理請(qǐng)求,并把請(qǐng)求的結(jié)果,也就是HTML發(fā)送到客戶瀏覽器.

  HttpApplication是HttpRuntime所創(chuàng)建的嗎? 并不是,HttpRuntime只是向HttpApplicationFactory提出請(qǐng)求,要求返回一個(gè)HttpApplication對(duì)象。HttpApplicationFactory在接收到請(qǐng)求后,會(huì)先檢查是否有已經(jīng)存在并空閑的對(duì)象,如果有就取出一個(gè)HttpApplication對(duì)象返回給HttpRuntime,如果沒(méi)有的話,則要?jiǎng)?chuàng)建一個(gè)HttpApplication對(duì)象給HttpRunTime。

  關(guān)于HttpApplication這個(gè)類的方法的實(shí)現(xiàn),就不再一一解釋,需要了解的,在類里面寫(xiě)上一個(gè)HttpApplication單詞,然后右鍵選擇“轉(zhuǎn)到定義“,就可以看到里面的元數(shù)據(jù)了。

  從上面看出global類與HttpApplication十分緊密,其事上,global類是繼承與System.Web.HttpApplication類。

public class Global : System.Web.HttpApplication
    {

        
protected void Application_Start(object sender, EventArgs e)
        {

        }
        
//省略
    }

NET技術(shù)HttpApplication的認(rèn)識(shí)與加深理解,轉(zhuǎn)載需保留來(lái)源!

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

主站蜘蛛池模板: 莒南县| 越西县| 博客| 湖北省| 乌什县| 襄城县| 厦门市| 雷州市| 涞源县| 曲阳县| 潮州市| 府谷县| 义乌市| 肇州县| 乃东县| 敖汉旗| 伊金霍洛旗| 通许县| 曲松县| 吉木萨尔县| 同仁县| 南京市| 高雄市| 海南省| 东安县| 合阳县| 遂川县| 同心县| 博湖县| 遂溪县| 荥经县| 巴彦县| 汉沽区| 滕州市| 水富县| 大化| 阿巴嘎旗| 垦利县| 洪泽县| 通河县| 新源县|