页面生成周期中的两个Application池的详情小弟了解
我們知道在asp.net頁面的生成周期一開始的時(shí)候會(huì)調(diào)用一次Application對(duì)象的Application_start方法,我們都知道這個(gè)方法僅僅是在第一次執(zhí)行的時(shí)候調(diào)用的,但是我們知道http請(qǐng)求是沒有狀態(tài)的,每次客戶來了請(qǐng)求信息之后,經(jīng)過頁面生存周期的話,都會(huì)提前去反射編譯global文件回去到元數(shù)據(jù),生成一個(gè)Application對(duì)象,并且把他放入Application池中,這個(gè)對(duì)象維護(hù)了我們的請(qǐng)求管道模型,這樣看來,客戶的每一個(gè)請(qǐng)求都會(huì),都會(huì)去判斷池中有沒有Application對(duì)象有就取出來,沒有就去創(chuàng)建這個(gè)對(duì)象,這樣多個(gè)請(qǐng)求,都會(huì)有Application對(duì)象,那他是怎么讓這個(gè)Application_start方法僅僅執(zhí)行一次的那?頓時(shí)讓我疑惑不解,后來經(jīng)過仔細(xì)查看源代碼后,才發(fā)現(xiàn),在整個(gè)管道中維護(hù)著的并不是一個(gè)Application對(duì)象,而是兩個(gè),一個(gè)特殊的Application池,這個(gè)池中存放的是特殊的全局的靜態(tài)的Application對(duì)象,同時(shí)這個(gè)對(duì)象也可以存儲(chǔ)一些全局的信息例如:我們統(tǒng)計(jì)網(wǎng)站在線人數(shù)信息使用,而另外的一個(gè)普通的Application池中存放的側(cè)是真正維護(hù)管道19個(gè)事件的Application對(duì)象;這樣在去想一下我們的管道就順理成章了;
查看反編譯源代碼:
從IIS中的擴(kuò)展程序把請(qǐng)求信息交給.net Framework開始:
首先通過ISAPIRuntime對(duì)象的Public int ProcessRequest(IntPrt ecb,int iWRType),這個(gè)方法中一個(gè)很牛逼的就是通過擴(kuò)展程序把請(qǐng)求信息傳到這個(gè)方法的ecb指針,同時(shí)這也是從擴(kuò)展程序(非托管程序)到.net中的托管程序的一個(gè)交界處,這個(gè)ecb指針就執(zhí)行了原始的請(qǐng)求信息的資源,是Windows中的一個(gè)資源,
在這個(gè)ProcessRequst方法中:wr=ISAPIWorkerRequest.CreateWorkerRequest(ecb,useropp) 把請(qǐng)求信息做了簡單的封裝到了WorkRequest對(duì)象中HttpRuntime.ProcessRequestNoDemand(wr);
最后交給了httpruntime對(duì)象的ProcessRequst方法來處理copntext=new HttpContext(wr,false);
在這個(gè)方法中又哦他能夠給傳遞來的Workrequest對(duì)象創(chuàng)建了上下文對(duì)象,上下文對(duì)象中封裝了完成了請(qǐng)求和響應(yīng)報(bào)文信息HttpRequest和HttpResponse對(duì)象
同時(shí)IhttpHandler applicationInstance=HttpApplicationFactory.GetApplicationInstance(context)通過工廠創(chuàng)建了HttpApplication對(duì)象,進(jìn)入這個(gè)方法GetApplicatioinInstance(context)后發(fā)現(xiàn):_theApplicationFactory.EnsureInited()內(nèi)部保證了global文件的編譯,內(nèi)部做了判斷沒有編譯的話就編譯這個(gè)文件,其次_theApplicationFactory.EnsureAppStartCalled(context)保證了Application_Start方法的執(zhí)行,進(jìn)入這個(gè)方法,里面進(jìn)行了判斷,如果這個(gè)方法沒有調(diào)用,this.FireApplicaioinOnStart(context)就去執(zhí)行這個(gè)方法,這個(gè)方法中HttpApplication specialApplicationInstance=this.GetSpecialApplicationInstance();獲取了一個(gè)特殊的Application實(shí)例
其次我們?cè)诨氐轿覀兊腉etApplicatioinInstance(context)方法來 里面的最后提到了return _theApplicationFactory.GetNormalApplicationInstance(context)返回一個(gè)NormalApplication實(shí)例,讓這個(gè)實(shí)例去維護(hù)我們的Application管道,這樣看下來就闊然開朗了,終于把疑惑很久的問題解決了。
轉(zhuǎn)載于:https://www.cnblogs.com/One-dream-man/archive/2012/08/25/2656926.html
總結(jié)
以上是生活随笔為你收集整理的页面生成周期中的两个Application池的详情小弟了解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows Server 2000
- 下一篇: ((ios开发学习笔记 十一))自定义T