日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

深入剖析ASP.NET組件設(shè)計(jì)]一書第三章關(guān)于ASP.NE

系統(tǒng) 2816 0
原文地址:
http://www.cnblogs.com/Heroman/archive/2005/05/12/153975.html
這一章是全書基礎(chǔ)和精神所在,其后的例子章節(jié)是為了驗(yàn)證這章的講述和實(shí)踐講述的內(nèi)容
其中第一節(jié)是講述ASP.NET運(yùn)行模式,這一節(jié)著眼于整個(gè)ASP.NET應(yīng)用程序的運(yùn)作模式,實(shí)際上,并不是在講組件,但是卻很重要,因?yàn)閷懡M件的人必須清楚的知道ASP.NET應(yīng)用程序是如何啟動(dòng).如何處理請(qǐng)求,如何處理SESSION等這些細(xì)節(jié)問題的,但這一節(jié)對(duì)于一般讀者來講,可能十分晦澀.下面的講解可能有助于你理解這一切.
一個(gè)ASP.NET的應(yīng)用程序是開始于IIS的.
當(dāng)你請(qǐng)求一個(gè)包含ASP.NET應(yīng)用的網(wǎng)址時(shí),IIS接受到請(qǐng)求(IIS是WEB服務(wù)守候進(jìn)程),IIS收到請(qǐng)求后,會(huì)根據(jù)請(qǐng)求者請(qǐng)求的主機(jī)頭或者IP或者端口號(hào)來找到對(duì)應(yīng)的站點(diǎn).

當(dāng)找到站點(diǎn)后,如果你請(qǐng)求的資源是以ASPX為結(jié)尾的WEBFORM,時(shí),IIS會(huì)將控制權(quán)交給一個(gè)ISAPI擴(kuò)展.,名叫AspNet_ISAIP.DLL.這時(shí),控制權(quán)由IIS交到ASPNET的ISAPI擴(kuò)展上.,需要說明的是,ISAPI擴(kuò)展的級(jí)別低于IIS,但高于用戶站點(diǎn),它獨(dú)立于站點(diǎn)之外

ISAPI收到處理請(qǐng)求后,會(huì)啟動(dòng)一個(gè)ASP.NET工作進(jìn)程.然后將請(qǐng)求者的請(qǐng)求信息轉(zhuǎn)交給ASP.NET工作進(jìn)程(名為ASPNET_WP.EXE).接下來,控制權(quán)由ASPNET_WP掌握.ASPNET_WP首先解出請(qǐng)求者的信息,如果請(qǐng)求者請(qǐng)求的ASP.NET應(yīng)用程序(站點(diǎn)或虛擬目錄,通俗一點(diǎn))尚未擁有APPDOMAIN,ASPNET_WP就會(huì)建立一個(gè)APPDOMAIN,并且將被請(qǐng)求的ASP.NET應(yīng)用所需的Assembly(就是那些DLL,例如System.Web.DLL等)載入到APPDOMAIN中

以上的步驟可以看到一個(gè)結(jié)論和規(guī)律:控制權(quán)是以流水式在各個(gè)請(qǐng)求處理者間傳遞,并且,前一個(gè)處理請(qǐng)求者必須負(fù)責(zé)傳遞后一個(gè)處理請(qǐng)求者所需的信息.而且要負(fù)責(zé)裝載或初始化后一個(gè)處理者,這很像我們生活中的接力賽.

問題是,可能有許多人會(huì)問:干嘛要如此繁瑣呢?直接由IIS把請(qǐng)求轉(zhuǎn)交給ASPNET_WP如何呢?不是不可以,而是如此一來,這個(gè)處理過程的可擴(kuò)展性就變低了.ASPNET ISAPI是IIS和ASPNET_WP之間的橋梁.雖然看起來它僅僅負(fù)責(zé)轉(zhuǎn)交請(qǐng)求等工作.可是這樣一來,就大大擴(kuò)展延展性.

另外一個(gè)疑問是關(guān)于APPDOMAIN的,包括我,對(duì)于APPDOMAIN一開始的理解就曾陷入誤區(qū),APPDOMAIN這東東微軟講的也比較含糊,有人說跟進(jìn)程一樣,但我一開始理解成了IIS里的應(yīng)用程序池,所以,走了不少?gòu)澛?實(shí)際上,APPDOMAIN既不是進(jìn)程,也不是IIS里的應(yīng)用程序池概念..NET下的所有應(yīng)用程序都運(yùn)行于APPDOMAIN之中(我自己的理解),每一個(gè)APPDOMAIN是一個(gè)執(zhí)行的容器,每執(zhí)行一個(gè)應(yīng)用程序或者ASP.NET應(yīng)用,.NET執(zhí)行環(huán)境就會(huì)建立一個(gè)APPDOMAIN,然后把應(yīng)用程序需要的一些DLL載入.APPDOMAIN的功能很像進(jìn)程,但絕不是進(jìn)程.你可以這樣理解,APPDOMAIN就是ASP.NET應(yīng)用程序的執(zhí)行環(huán)境吧.

AspNet_WP不光負(fù)責(zé)建立APPDOMAIN(當(dāng)然,如果已經(jīng)存在的話,就直接使用這個(gè)DOMAIN了),另外,它在APPDOMAIN建立后,還會(huì)將請(qǐng)求轉(zhuǎn)發(fā)至對(duì)應(yīng)的APPDOMAIN中的ISAPIRuntime對(duì)象。(Isapiruntime對(duì)象是APPDOMAIN的一部分)。ISAPIRUNTIME專門負(fù)責(zé)解出請(qǐng)求的必要信息。它將信息和請(qǐng)求轉(zhuǎn)交給HttpRuntime。在這里,需要說明的是IsapiRuntime是一個(gè)類,它的全稱是System.Web.Hosting.ISAPIRuntime,而HttpRuntime也是一個(gè)類,它的全稱是System.Web.HttpRuntime。因此,可以說,這兩個(gè)對(duì)象是APPDOMAIN運(yùn)行環(huán)境的一部分,在ASPNET_WP建立APPDOMAIN的同時(shí),也會(huì)作為運(yùn)行環(huán)境來建立這兩個(gè)對(duì)象.

由于接二連三的講述了幾個(gè)對(duì)象,所以,當(dāng)我第一遍看這本書特別是看到這部分時(shí),覺得特別暈,因?yàn)榈谝粚?duì).NET FRAMEWORK的類庫(kù)不甚了解,第二,對(duì)ASP.NET的運(yùn)行原理初次接觸.摸不著頭腦,總想把這些對(duì)象名稱與某個(gè)DLL或者某個(gè)實(shí)際上的文件來對(duì)應(yīng).其實(shí)不然,不管是ISAPIRuntime也好,還是HttpRuntime,它們?cè)贏PPDOMAIN建立時(shí),作為APPDOMAIN的一部分被實(shí)例化.所以它們代表的是內(nèi)存中的一個(gè)類的實(shí)例,也就是對(duì)象.并且,這上面的一部分運(yùn)作原理,似乎跟ASP.NET應(yīng)用程序沒有直接聯(lián)系.似乎不入正題,很容易讓初看者不知所云.實(shí)際上,可以說,由IIS到ISAPI是完成了請(qǐng)求的第一個(gè)部,也就是接納客戶請(qǐng)求.由ISAPI到APPDOMAIN,是第二部分,也就是初始化部分,旨在建立處理請(qǐng)求的大環(huán)境,為下面處理請(qǐng)求和運(yùn)行ASP.NET應(yīng)用程序作好準(zhǔn)備.

接下來,當(dāng)APPDOMAIN初始化完成后,接下來就需要建立會(huì)話了吧,因此,請(qǐng)求由HttpRuntime來接受,HttpRunTime主要的工作便是為每一個(gè)提出請(qǐng)求的客戶建立一個(gè)HttpContext對(duì)象.這個(gè)東東又管理著HttpSession對(duì)象.每一個(gè)訪問者有各自的HttpContext對(duì)象和HttpSession對(duì)象,這些對(duì)象,你可以在.NET FRAMEWORK庫(kù)中找到對(duì)應(yīng)的類名,像System.Web.HttpContext,System.Web.HttpSessionState等.

可以看出,請(qǐng)求的處理過程非常類似于.NET中事件模型的處理過程.若干個(gè)處理模塊被串接到一個(gè)事件上.在ASP.NET運(yùn)行原理里,也是,若干個(gè)模塊依次輪流處理一個(gè)請(qǐng)求,像流水線操作一樣.

另外,作為組件開發(fā)者,還要明確一個(gè)HttpRuntime,HttpContext,HttpSession這些對(duì)象的層次關(guān)系和調(diào)用創(chuàng)建關(guān)系.細(xì)節(jié)部分無需了解,只要知道誰創(chuàng)建了誰,誰被誰調(diào)用即可

HttpRuntime負(fù)責(zé)創(chuàng)建HttpContext和HttpSession,httpContext負(fù)責(zé)管理httpSession


到HttpRuntime創(chuàng)建完httpContext為止,實(shí)際上,你的應(yīng)用程序仍然沒有運(yùn)行,或者說,請(qǐng)求者的請(qǐng)求實(shí)際上并未真正的被處理,前面的工作都是些準(zhǔn)備性或者輔助性的工作.

HttpRuntime除了創(chuàng)建上面的對(duì)象外,還要?jiǎng)?chuàng)建HttpApplication.至于創(chuàng)建Application對(duì)象的過程,是比較復(fù)雜的.你可以把其作為一個(gè)分支流程涉略一下



接下來,HttpApplication調(diào)用ProcessRequest方法來處理用戶請(qǐng)求,此方法會(huì)調(diào)用對(duì)應(yīng)的HttpHandler來處理用戶請(qǐng)求,HttpHandler根據(jù)用戶請(qǐng)求的文件的擴(kuò)展名處理請(qǐng)求,并把請(qǐng)求的結(jié)果,也就是HTML發(fā)送到客戶瀏覽器

另外,過程的復(fù)雜性遠(yuǎn)遠(yuǎn)超出了上面的描述,基本上,黃先生這本書的第三章第一節(jié)用了十幾頁文本在描述ASP.NET運(yùn)行過程及原理,以及處理請(qǐng)求時(shí)用的一些手法,但總體上的過程如上面的描述那樣,只不過,我沒有將建立各種對(duì)象時(shí)的細(xì)節(jié)剝離出來展示給大家.黃先生原著上的這節(jié)內(nèi)容實(shí)際上非常詳細(xì).但為何大家看起來均言吃力呢?一方面是因?yàn)樵聿糠忠幌虮容^麻煩,另外一方面,是因?yàn)辄S先生在講述時(shí),沒有先向大家概要的描述過程和綱領(lǐng),然后再描述細(xì)節(jié),再是直接把細(xì)節(jié)和綱領(lǐng)融合在一起.這樣,如果看的時(shí)候,沒有去將這節(jié)的各個(gè)小標(biāo)題和內(nèi)容串聯(lián)起來并先總結(jié)出綱領(lǐng)來的話.看完后,就會(huì)頭暈.實(shí)際上,整個(gè)講述就是在描述ASP.NET處理請(qǐng)求的過程.如果隱藏所有技術(shù)性的細(xì)節(jié),而只講流程的話,大家可能很快理解.然后再將流程中的每一部分的技術(shù)細(xì)節(jié)展現(xiàn)出來,我想,容易理解的多.這好比講故事,先將故事梗概說一下比較好吧.

當(dāng)然,我不是說黃先生寫的不好,實(shí)際上,這一節(jié)寫的很透徹,看懂了,就很受用.流程是很重要的,它的重要性在于你知道了在何時(shí)發(fā)生何事,就可以在指定的時(shí)間點(diǎn)做一些處理.這一點(diǎn),在黃先生本書以后的章節(jié)中講述ASP.NET PAGE對(duì)象執(zhí)行流程中更顯重要.

下面的圖對(duì)整個(gè)ASP.NET應(yīng)用運(yùn)行過程中的各個(gè)對(duì)象的職能以及流程做了圖解.當(dāng)然,圖解拋棄了技術(shù)性的細(xì)節(jié),例如,像HttpApplication如何建立等

深入剖析ASP.NET組件設(shè)計(jì)]一書第三章關(guān)于ASP.NET運(yùn)行原理講述的補(bǔ)白

深入剖析ASP.NET組件設(shè)計(jì)]一書第三章關(guān)于ASP.NET運(yùn)行原理講述的補(bǔ)白


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 精河县| 浦城县| 河津市| 裕民县| 达州市| 峨边| 海阳市| 高唐县| 巴青县| 革吉县| 武鸣县| 阳春市| 普兰店市| 收藏| 蒲城县| 新乡县| 宁陵县| 黔西| 隆子县| 无为县| 鹤庆县| 武平县| 汶川县| 滕州市| 民勤县| 安新县| 册亨县| 罗源县| 全州县| 盐边县| 昭苏县| 浑源县| 额济纳旗| 安达市| 康平县| 正镶白旗| 关岭| 冕宁县| 湛江市| 武汉市| 江阴市|