我可以想象他是如何支持ASP.NET應(yīng)用模型的,難道他也用ISAPI過濾器做一些事情嗎?
是的,他也用它做一些事情。我們也支持一種叫做ASP模塊擴(kuò)展點(diǎn)的技術(shù)。他基本上允許你像一個(gè)函數(shù)那樣使用ISAPI過濾器。我們提及的很多例子,如替換Session State等工作都是在那個(gè)級(jí)別實(shí)現(xiàn)的。此外,重定向URL的工作也是在這個(gè)級(jí)別實(shí)現(xiàn)的。例如,我們的許多客戶經(jīng)常要為他們的用戶提供個(gè)性化的URL,像financial institution站點(diǎn)就可以為他的顧客提供www.financialinstitution.com/scott這樣的URL為一個(gè)名叫SCOTT的用戶,因?yàn)樗麄儾幌雱?chuàng)建太明顯的路徑,所以要借用重定向技術(shù)提供各種各樣的不可視的URL,你可以在ASP.NET上實(shí)現(xiàn)這樣的功能。 帶有"/scott" URL,實(shí)際上被ASP.NET轉(zhuǎn)換成他要去的地方,是嗎?
是的,因此在實(shí)際運(yùn)行前,你會(huì)有一些代碼解析"/scott" 部分,轉(zhuǎn)換成一個(gè)實(shí)際地址的頁(yè)面,實(shí)際執(zhí)行的是一個(gè)很普通的頁(yè)面。這種方式可以使得所有的用戶都得到個(gè)性化。我們有一個(gè)模塊中的一個(gè)API可以為你解決這個(gè)問題。在這個(gè)問題上,我們也有一個(gè)擴(kuò)展點(diǎn)。在ASP的時(shí)候,我們有一個(gè)叫做Global.asa的概念,他可以定義應(yīng)用開始,應(yīng)用結(jié)束,Session 開始,Session結(jié)束等事件。在ASP.NET中我們?cè)试S您將ISAPI過濾器功能加入Global.asa中,因此,如果您想繼續(xù)重定向URL時(shí)候,你甚至不需要寫一個(gè)模塊了,你只需要在Global.asa中定義就足夠了。
我們做的另一點(diǎn)是,努力提高安全水平并且允許更為靈活的認(rèn)證,在過去,您使用ASP的時(shí)候,您主要用IIS來構(gòu)建您的認(rèn)證功能,這種認(rèn)證實(shí)際上依賴NT SAM,在ASP.NET中,我們將安全模塊放入ISAPI過濾器中,因此如果您想在一個(gè)main frame 或者在你有一些usernames/passwords的數(shù)據(jù)庫(kù)中,并且是你自己做這種認(rèn)證時(shí),你可以在Global.asa中寫入相關(guān)的信息或者在一個(gè)與那個(gè)事件同步的組件中加入相關(guān)信息。
因此,我可孕匆桓鑫易約河沒氖菘飭,并沁b勾斜曜嫉娜現(xiàn)す獺?BR>是的,沒錯(cuò)。如果你這樣做了,你可以獲得更多的東西,你不僅可以擁有了用戶名字和口令,而且還會(huì)有角色(role)這樣的東西。你可以將那些用戶映射成角色,你可以使用這種方式而不是僅僅使用ACL的方式構(gòu)建你的站點(diǎn)。你可以知道Joe 和 Mark(用戶名)訪問了這個(gè)頁(yè)面,相反,你也可以知道這個(gè)頁(yè)面被哪個(gè)角色訪問了。你在數(shù)據(jù)庫(kù)的主要工作就是告訴我們 Mark 的用戶名和密碼是什么,他在哪一組角色中,其余的工作由安全系統(tǒng)來考慮,以保證它可以訪問那些網(wǎng)頁(yè)或者服務(wù)。當(dāng)然,這里需要提及的是,所有的架構(gòu),安全架構(gòu)、caching架構(gòu)都為網(wǎng)頁(yè)和XML服務(wù)提供支持。
如果從性能角度來看,增加的這些東西,這些能力,可以提供更好的性能服務(wù)嗎?
我們的確提供了更好的性能服務(wù),當(dāng)我們創(chuàng)建ASP.NET項(xiàng)目組時(shí),我們就指定一個(gè)開發(fā)人員專門負(fù)責(zé)性能上的工作,我們當(dāng)時(shí)使用的是早期的common language runtime,他每日的工作就是檢查每項(xiàng)操作是變快了還是變慢了,并且與運(yùn)行時(shí)(runtime)項(xiàng)目組一起查找問題,加速變慢了的操作。同時(shí),他也指出性能上的問題。這樣做的結(jié)果是ASP.NET比ASP要更快。所有的代碼都是編譯過的,編譯成本地代碼,不再用解釋的方式。
是嗎,那么說我在ASP.NET中寫的程序代碼再也不用解釋的方式?
正確。此外,更好的是,您仍然可以像您從前那樣在編輯器里面編寫代碼,點(diǎn)擊SAVE存盤,然后剩下的事情都交給系統(tǒng)去處理。但是,對(duì)于剩下工作ASP與ASP.NET確有不同處理方式。ASP采用的是分析代碼然后傳給腳本引擎,在程序運(yùn)行時(shí)解釋代碼;而ASP.NET則是傳給編譯器,然后在common language runtime上運(yùn)行。在common language runtime上執(zhí)行的是本地代碼,因此你可以用VB編制程序獲得與C++一樣級(jí)別的性能。
那么,它是在什么時(shí)候編譯,是在我存儲(chǔ)文件并且NT文件系統(tǒng)發(fā)現(xiàn)文件變化時(shí),還是頁(yè)面第一次使用的時(shí)候?
當(dāng)某人請(qǐng)求頁(yè)面的時(shí)候發(fā)生。我們將會(huì)檢查,是否某個(gè)頁(yè)面已經(jīng)被編譯,如果沒有編譯,我們將會(huì)編譯他。我們?cè)贏SP.NET中作了許多很有趣的工作,使得編譯過程更有效率。因?yàn)槲覀兙幾g了他,所以如果你為了使機(jī)器更可靠或者性能更好而重起機(jī)器或者shut down你的WEB服務(wù)器或者shut down你的進(jìn)程時(shí),你不用再編譯你的那個(gè)頁(yè)面了,因?yàn)槲覀円呀?jīng)檢測(cè)到了該文件已經(jīng)被編譯和加載,這樣可以獲得更高的響應(yīng)速度和更強(qiáng)的伸縮性,并且那也是因?yàn)榘阉旁贑ACHE的某個(gè)地方了。
下面我們?cè)谡務(wù)撘幌滦阅。好,我們談(wù)撘幌滦阅埽堑,從整體上看,性能是更優(yōu)化了。我們也在可擴(kuò)展性,可靠性,可獲取性方面作了很多的工作。我們?cè)?jīng)有一個(gè)假設(shè),在一個(gè)common language runtime上,即使有一個(gè)Session想要和所有與他相關(guān)的東西通信的話,應(yīng)用程序的可靠性仍然變得很高。
我們還可以舉些例子。例如,真正強(qiáng)大的類型檢查。在一個(gè)可管理的環(huán)境中,如果出現(xiàn)數(shù)組越界的情況,系統(tǒng)將會(huì)拋出一個(gè)exception而不會(huì)產(chǎn)生一個(gè)垃圾內(nèi)存。除此之外,我們還有更多的可靠性機(jī)制保證您的使用。例如,我們可以檢測(cè)內(nèi)存沖突,也就是內(nèi)存在某一點(diǎn)徘徊。我們可以檢測(cè)到死鎖,你甚至可以配置系統(tǒng)以便在發(fā)生這樣的情況的時(shí)候,你的機(jī)器可以每隔多長(zhǎng)時(shí)間重起一次。因此,在出現(xiàn)這樣的情況的時(shí)候,我們可以規(guī)定一小時(shí)一次、一天一次或者每隔200個(gè)請(qǐng)求一次等來啟動(dòng)一個(gè)應(yīng)用程序的新的實(shí)例。然后允許舊的應(yīng)用程序完成相關(guān)的任務(wù)后,新的程序接著進(jìn)行。
保持這樣的一個(gè)可靠性機(jī)制使得你不必中斷任何為用戶工作的服務(wù)。我們將會(huì)動(dòng)態(tài)地生成一個(gè)新的進(jìn)程,開始接受新的請(qǐng)求,老的進(jìn)程完成當(dāng)前運(yùn)行的所有請(qǐng)求,然后我們將刪除老的進(jìn)程。在這樣的過程中,為了提高效率,系統(tǒng)實(shí)際上作了RESET的工作。但是這個(gè)過程中,你不會(huì)看見管理人員的干涉。你的客戶也不會(huì)感覺到任何變化,他們會(huì)認(rèn)為,嗷,每一件事情都運(yùn)行的這樣好,服務(wù)器還在運(yùn)行。用這樣的方式,你就可以獲得非常高的可靠性。
此外,我們?cè)赟ession State上也有了一些改進(jìn),Session State不再需要和你的代碼運(yùn)行在同一個(gè)進(jìn)程中。他可以作為一種服務(wù)運(yùn)行在一臺(tái)機(jī)器上,也可以作為一種服務(wù)運(yùn)行在整個(gè)WEB服務(wù)器群中的某一臺(tái)機(jī)器上,其他的前端機(jī)器可以共享該服務(wù)。
Session State只能存放在一臺(tái)機(jī)器上嗎?
不,不是的,如果需要的話可以在多臺(tái)機(jī)器上保留。Session State可以在多臺(tái)機(jī)器上存儲(chǔ),也可以有多臺(tái)機(jī)器的前端去訪問那些存儲(chǔ)信息。
我是一個(gè)用戶,我正在訪問一臺(tái)機(jī)器,我的Session State留在這臺(tái)機(jī)器上,如果我下一次要訪問另一臺(tái)機(jī)器,Session State中的數(shù)據(jù)可以共享嗎?
是的,這種工作方式是WEB群組最典型的工作方式。一個(gè)用戶你可以訪問機(jī)器A,等一會(huì)兒,你又會(huì)訪問機(jī)器B,你的Session State保留在另外一臺(tái)獨(dú)立的機(jī)器上。Session State既可以運(yùn)行在我們的Session State provider上面也可以運(yùn)行在SQL Server上面,我們有一種方式可以讓SQL Server成為Session信息的服務(wù)器。但是,前端的這兩臺(tái)機(jī)器,也可以是多臺(tái)機(jī)器,都可以訪問同樣的Session State。
這樣看來,我們可以通過這種方式共享數(shù)據(jù)了。
是的,正確。但是你可以想象一旦你擁有這種Session State,與你的ASP代碼不在一個(gè)進(jìn)程中運(yùn)行的Session State,無論你的ASP程序遇到下面什么樣的問題,程序崩潰、我們終止了你的代碼運(yùn)行、我們檢測(cè)到某種資源漏洞或者鎖定、我們所配置的一些事情(例如一小時(shí)一次)遇到問題時(shí),你所有的Session依然是安全的。因?yàn)椋銓⒛愕腟ession State保存在另外一臺(tái)獨(dú)立的機(jī)器上了。
如果你只有一臺(tái)機(jī)器,你也可以利用Session State的這種特點(diǎn),你可以讓他運(yùn)行的進(jìn)程與你的代碼運(yùn)行的進(jìn)程不同,因此,只要進(jìn)程到來時(shí),他們就可以訪問在安全保護(hù)進(jìn)程中的Session State。
正如我們剛才提到的,Session State最重要的幾個(gè)好處是:(1)可靠性。你不用再擔(dān)心你的應(yīng)用程序崩潰或者一個(gè)用戶數(shù)據(jù)丟失這樣的事情發(fā)生。(2)第二個(gè)好處是,現(xiàn)在,你的應(yīng)用程序不必再局限于一臺(tái)機(jī)器。如果你使用了Session State ,你的確可以將你的應(yīng)用擴(kuò)展到更多臺(tái)的機(jī)器上,這樣,就真的沒有什么條件能夠限制你了,也就是說,你不必再擔(dān)心你的應(yīng)用程序能夠在多大范圍內(nèi)或者能夠?yàn)槎嗌儆脩籼峁┱7⻊?wù)這樣的問題。
聽了上面的講解,我們好像做了兩種不同的事情,一個(gè)是ASP.NET提供了許多新的功能和性能,人們可以充分利用這些新的特點(diǎn);另外一個(gè)方面是,在這些功能和性能的后面,ASP.NET做了許多額外的工作,使得這些特征和功能發(fā)揮了更大的作用。
是這樣的
對(duì)我來說,如果我已經(jīng)有了一個(gè)ASP的WEB站點(diǎn),如果他已經(jīng)為我提供了滿意的結(jié)果,我不想再改變程序中的任何東西,如果我將站點(diǎn)的整個(gè)框架更新到新的ASP.NET上或者類似的東西上,那么就意味著我的站點(diǎn)獲得更多的魯棒性。
是這樣的,你說的的確是一個(gè)很有趣的觀點(diǎn)。我確信,如果你是那個(gè)用戶,你說那個(gè)站點(diǎn)的應(yīng)用程序運(yùn)行良好,我的確不想做任何改變,如果我需要升級(jí)到ASP.NET框架的時(shí)候,我只想在我的機(jī)器上安裝這個(gè)ASP.NET即可。如果你這樣做了,我們并不會(huì)替換你的機(jī)器上任何的ASP代碼,因此ASP與ASP.NET運(yùn)行在一臺(tái)機(jī)器上。但是,你實(shí)際上將不得不將運(yùn)行環(huán)境讓位給ASP.NET,并且重新配置你的機(jī)器。盡管作這樣的事情沒有什么難的,但是你需要告訴我們你想讓ASP.NET運(yùn)行ASP的那些程序。因?yàn)椋绻粋(gè)機(jī)器里已經(jīng)存在了多個(gè)應(yīng)用程序的時(shí)候,你再想安裝一個(gè)新的運(yùn)行環(huán)境,新的編譯環(huán)境,和所有新的.NET的那些東西時(shí),我們不能完全保證你的每個(gè)應(yīng)用程序在升級(jí)后的環(huán)境中都運(yùn)行良好,都帶給你同樣的性能。做服務(wù)器程序的開發(fā)人員將會(huì)用很長(zhǎng)的時(shí)間調(diào)試他們的程序,以確保程序正常工作。
如果我是按照你們說的去做,那么,好,我安裝了ASP.NET,我標(biāo)記了我的文件,并且告訴他們:現(xiàn)在你們運(yùn)行在ASP.NET的環(huán)境中,就算是我根本沒有對(duì)文件作任何改變,我是否可以獲得具有更高魯棒性和更好柔韌性的解決方案?
是的,你將獲得具有更高魯棒性和更好柔韌性的解決方案。不過,在這里我要提及的一個(gè)重要的事情是,我們當(dāng)前的解決方案不是百分之百地與ASP兼容。眾所周知,盡管我們的ASP.NET與ASP之間具有非常非常的親密關(guān)系,但是,最近幾年里,當(dāng)我們開發(fā)這個(gè)平臺(tái)的時(shí)候,由于若干的總總原因,我們不得不犧牲一些兼容性。但是人們根本不會(huì)感覺到這些。在ASP.NET中,我們獲得COOKIES的順序?qū)嶋H上稍稍發(fā)生了一些變化。這一切正如我們期望的那樣,不會(huì)有百分之百的兼容。不過最重要的是,無論發(fā)生了怎樣的變化,如果你安裝了ASP.NET后,你現(xiàn)有的代碼和你現(xiàn)有的網(wǎng)頁(yè)將依然會(huì)正常的工作。
從整體上看ASP.NET對(duì)你是有幫助的,但是由于它本身的一些小小的變化,你將不得不隨之作一些小小的調(diào)整。我們會(huì)有一些自動(dòng)化的工具幫助你完成這一切。但是,對(duì)于大型的應(yīng)用來講,毫無疑問,你要做一些改變。
讓我們?cè)僖淮位仡櫼幌吕斫饽愕膽?yīng)用程序架構(gòu)的一些關(guān)鍵的事情或者簡(jiǎn)單看看那些新的事物
很好,這是一個(gè)很有意思的部分。這其實(shí)是一種移植工作。你可以將一個(gè)頁(yè)面,將你所掌握的技巧,將你能夠你所做的一切,將你寫的東西移植到ASP.NET上,你依然可以用同樣的技巧,同樣的技術(shù),但是你將獲得更高的性能。當(dāng)人們開始了解這個(gè)平臺(tái)的時(shí)候,我推薦給人們的是應(yīng)該了解這個(gè)平臺(tái)的所有特征。因?yàn)槌艘浦餐,還有很多的新的特征。也可能不僅僅是移植的過程還有一點(diǎn)點(diǎn)重建的過程。例如,我們?cè)谇懊嫣岬搅舜_認(rèn)的過程,大多數(shù)的應(yīng)用程序都可以用到不同程度的確認(rèn)過程。但是,他將不再是“保留你原來的確認(rèn)邏輯,并且讓他運(yùn)行的更快一些”,而是,完全被我們的確認(rèn)組件所替代。
許多人都已經(jīng)用ASP建立了他們自己的某種安全架構(gòu),他們可以用它來驗(yàn)證登錄信息,F(xiàn)在當(dāng)他們知道ASP.NET帶有這種功能是,他們會(huì)說,這下可好了,我可以直接使用ASP.NET內(nèi)嵌的認(rèn)證功能了,在也不用我自己編的那些東西,不再用Session State跟蹤用戶信息。
Caching是與性能相關(guān)的的一項(xiàng)重要的功能,我前面沒有提及,許多的開發(fā)人員非常努力并且使用了很多的非常好的技術(shù)試圖弄明白一個(gè)頁(yè)面的局部或者服務(wù)器上的整個(gè)一個(gè)頁(yè)面的運(yùn)行結(jié)果,以便當(dāng)兩個(gè)瀏覽器請(qǐng)求同一個(gè)特殊資源時(shí),不必重新生成兩次,我只要使用cache中的版本就可以了。在ASP.NET中,我們提供了一個(gè)對(duì)cache的支持。
我想說的基本也就這些,但是我認(rèn)為他們是值得花時(shí)間的,特別是你想快速開始時(shí),在SDK中,我們有大約900來個(gè)例子,這是一個(gè)很大的數(shù)目,我們有一些很大的端到端的應(yīng)用程序,一個(gè)電子商務(wù)的應(yīng)用,一個(gè)建立類似INTRANET門戶框架的應(yīng)用。我認(rèn)為,認(rèn)真研究這些應(yīng)用程序,并且看看他們是如何構(gòu)建的是一件很值得做的事情。因?yàn)槟銜?huì)發(fā)現(xiàn)你找到了很多技巧,意想不到地減少了你寫代碼的數(shù)量。使你的代碼更干凈。我想,你將會(huì)突然發(fā)現(xiàn)那些的確難以管理的50、60行的代碼變成了5、6行清晰的代碼,幾周之后,你再回來看看時(shí),一目了然。很容易弄清楚是什么意思。
小結(jié):
關(guān)于ASP.NET最重要的事情是,首先,他使得開發(fā)人員的效率大大地提高了。他使得應(yīng)用程序和系統(tǒng)的可靠性大大地增強(qiáng)了,有許多東西使得應(yīng)用程序真的很容易配置。例如,當(dāng)你的應(yīng)用程序正在運(yùn)行時(shí),如果你復(fù)制一個(gè)DLL時(shí),他沒有被鎖定,這樣你的應(yīng)用程序就可以平滑地移植到新版本上。舉這個(gè)例子是為了說明可以真正地提高性能、可靠性、可用性、可擴(kuò)展性。我想,所有這些能力都實(shí)際上是系統(tǒng)中最重要的事情。除此之外,我們還增加了大量的新的功能。我知道有很多的人看著ASP從1.0,2。0,到3.0成長(zhǎng)的,他們今天看到ASP.NET時(shí)候會(huì)說,嗷,對(duì)于server對(duì)象或者response 對(duì)象以及其他類似的東西還有三種不同的方法。這就是新特征帶給我們的巨大的財(cái)富。