直播中
技術(shù)話題 請問,你們這樣做的確切原因是什么?這樣做又意味著什么? 我們在上面討論了ASP新的構(gòu)架,并且命名為ASP.NET,還重新建造了它,這難道意味著如果我是一名ASP程序員,我必須拋棄我學習過的一切,為了適應ASP.NET,必須重新學習一種新思路嗎? 絕對不是的。如果你是一名ASP開發(fā)者,你仍然可以保持你目前的全部技能,并且非常輕易地將它們應用到ASP.NET中。如果你想繼續(xù)按照你原來的風格寫,你可以繼續(xù)使用。如果你想接受最新的編程方式,你可以開始這種體驗。不過,你可以漸漸地做到這一點,你可能會在許多新的特點中使用很多老的編碼風格,并且獲得這兩種風格的最佳優(yōu)點。 這樣說來,對于用戶來講,他們沒有必要考慮與瀏覽器或者web頁面打交道的這些事情,他們直接通過web service就可以訪問互聯(lián)網(wǎng)了? 由于有了以上這些技術(shù),你不一定非要從客戶端基于瀏覽器的應用程序中調(diào)用WEB服務。你還可以在一個普通的VB或者C#應用程序中使用WEB服務。 因此,你用一個簡單的AST.NET頁面,可以指向許多類型的設(shè)備。這些設(shè)備可能具有完全不一樣的特征。 這么說,是ASP.NET代碼確定了如何到一個小設(shè)備或者大設(shè)備這樣的事情嗎? 這是否意味著開發(fā)人員不得不考慮他們所遇到的所有不同的情況,例如,這是個彩色的瀏覽器那是一個POCKET PC的顯示界面。 你說的只是一些基本的確認,他們支持對數(shù)字的確認嗎? 嗷,在你提及ISAPI的時候,我想起了在ISAPI應用中有兩種完全不同的模式:ISAPI應用模式和ISAPI過濾器模式,ASP.NET是否支持這兩種不同模式? |
[Page]
我可以想象他是如何支持ASP.NET應用模型的,難道他也用ISAPI過濾器做一些事情嗎?
是的,他也用它做一些事情。我們也支持一種叫做ASP模塊擴展點的技術(shù)。他基本上允許你像一個函數(shù)那樣使用ISAPI過濾器。我們提及的很多例子,如替換Session State等工作都是在那個級別實現(xiàn)的。此外,重定向URL的工作也是在這個級別實現(xiàn)的。例如,我們的許多客戶經(jīng)常要為他們的用戶提供個性化的URL,像financial institution站點就可以為他的顧客提供www.financialinstitution.com/scott這樣的URL為一個名叫SCOTT的用戶,因為他們不想創(chuàng)建太明顯的路徑,所以要借用重定向技術(shù)提供各種各樣的不可視的URL,你可以在ASP.NET上實現(xiàn)這樣的功能。
帶有"/scott" URL,實際上被ASP.NET轉(zhuǎn)換成他要去的地方,是嗎?
是的,因此在實際運行前,你會有一些代碼解析"/scott" 部分,轉(zhuǎn)換成一個實際地址的頁面,實際執(zhí)行的是一個很普通的頁面。這種方式可以使得所有的用戶都得到個性化。我們有一個模塊中的一個API可以為你解決這個問題。在這個問題上,我們也有一個擴展點。在ASP的時候,我們有一個叫做Global.asa的概念,他可以定義應用開始,應用結(jié)束,Session 開始,Session結(jié)束等事件。在ASP.NET中我們允許您將ISAPI過濾器功能加入Global.asa中,因此,如果您想繼續(xù)重定向URL時候,你甚至不需要寫一個模塊了,你只需要在Global.asa中定義就足夠了。
我們做的另一點是,努力提高安全水平并且允許更為靈活的認證,在過去,您使用ASP的時候,您主要用IIS來構(gòu)建您的認證功能,這種認證實際上依賴NT SAM,在ASP.NET中,我們將安全模塊放入ISAPI過濾器中,因此如果您想在一個main frame 或者在你有一些usernames/passwords的數(shù)據(jù)庫中,并且是你自己做這種認證時,你可以在Global.asa中寫入相關(guān)的信息或者在一個與那個事件同步的組件中加入相關(guān)信息。
因此,我可以寫一個我自己用戶名的數(shù)據(jù)庫了,并且,他還帶有標準的認證過程。
是的,沒錯。如果你這樣做了,你可以獲得更多的東西,你不僅可以擁有了用戶名字和口令,而且還會有角色(role)這樣的東西。你可以將那些用戶映射成角色,你可以使用這種方式而不是僅僅使用ACL的方式構(gòu)建你的站點。你可以知道Joe 和 Mark(用戶名)訪問了這個頁面,相反,你也可以知道這個頁面被哪個角色訪問了。你在數(shù)據(jù)庫的主要工作就是告訴我們 Mark 的用戶名和密碼是什么,他在哪一組角色中,其余的工作由安全系統(tǒng)來考慮,以保證它可以訪問那些網(wǎng)頁或者服務。當然,這里需要提及的是,所有的架構(gòu),安全架構(gòu)、caching架構(gòu)都為網(wǎng)頁和XML服務提供支持。
如果從性能角度來看,增加的這些東西,這些能力,可以提供更好的性能服務嗎?
我們的確提供了更好的性能服務,當我們創(chuàng)建ASP.NET項目組時,我們就指定一個開發(fā)人員專門負責性能上的工作,我們當時使用的是早期的common language runtime,他每日的工作就是檢查每項操作是變快了還是變慢了,并且與運行時(runtime)項目組一起查找問題,加速變慢了的操作。同時,他也指出性能上的問題。這樣做的結(jié)果是ASP.NET比ASP要更快。所有的代碼都是編譯過的,編譯成本地代碼,不再用解釋的方式。
是嗎,那么說我在ASP.NET中寫的程序代碼再也不用解釋的方式?
正確。此外,更好的是,您仍然可以像您從前那樣在編輯器里面編寫代碼,點擊SAVE存盤,然后剩下的事情都交給系統(tǒng)去處理。但是,對于剩下工作ASP與ASP.NET確有不同處理方式。ASP采用的是分析代碼然后傳給腳本引擎,在程序運行時解釋代碼;而ASP.NET則是傳給編譯器,然后在common language runtime上運行。在common language runtime上執(zhí)行的是本地代碼,因此你可以用VB編制程序獲得與C++一樣級別的性能。
那么,它是在什么時候編譯,是在我存儲文件并且NT文件系統(tǒng)發(fā)現(xiàn)文件變化時,還是頁面第一次使用的時候?
當某人請求頁面的時候發(fā)生。我們將會檢查,是否某個頁面已經(jīng)被編譯,如果沒有編譯,我們將會編譯他。我們在ASP.NET中作了許多很有趣的工作,使得編譯過程更有效率。因為我們編譯了他,所以如果你為了使機器更可靠或者性能更好而重起機器或者shut down你的WEB服務器或者shut down你的進程時,你不用再編譯你的那個頁面了,因為我們已經(jīng)檢測到了該文件已經(jīng)被編譯和加載,這樣可以獲得更高的響應速度和更強的伸縮性,并且那也是因為把它放在CACHE的某個地方了。
下面我們在談論一下性能。好,我們談論一下性能,是的,從整體上看,性能是更優(yōu)化了。我們也在可擴展性,可靠性,可獲取性方面作了很多的工作。我們曾經(jīng)有一個假設(shè),在一個common language runtime上,即使有一個Session想要和所有與他相關(guān)的東西通信的話,應用程序的可靠性仍然變得很高。
我們還可以舉些例子。例如,真正強大的類型檢查。在一個可管理的環(huán)境中,如果出現(xiàn)數(shù)組越界的情況,系統(tǒng)將會拋出一個exception而不會產(chǎn)生一個垃圾內(nèi)存。除此之外,我們還有更多的可靠性機制保證您的使用。例如,我們可以檢測內(nèi)存沖突,也就是內(nèi)存在某一點徘徊。我們可以檢測到死鎖,你甚至可以配置系統(tǒng)以便在發(fā)生這樣的情況的時候,你的機器可以每隔多長時間重起一次。因此,在出現(xiàn)這樣的情況的時候,我們可以規(guī)定一小時一次、一天一次或者每隔200個請求一次等來啟動一個應用程序的新的實例。然后允許舊的應用程序完成相關(guān)的任務后,新的程序接著進行。
保持這樣的一個可靠性機制使得你不必中斷任何為用戶工作的服務。我們將會動態(tài)地生成一個新的進程,開始接受新的請求,老的進程完成當前運行的所有請求,然后我們將刪除老的進程。在這樣的過程中,為了提高效率,系統(tǒng)實際上作了RESET的工作。但是這個過程中,你不會看見管理人員的干涉。你的客戶也不會感覺到任何變化,他們會認為,嗷,每一件事情都運行的這樣好,服務器還在運行。用這樣的方式,你就可以獲得非常高的可靠性。
此外,我們在Session State上也有了一些改進,Session State不再需要和你的代碼運行在同一個進程中。他可以作為一種服務運行在一臺機器上,也可以作為一種服務運行在整個WEB服務器群中的某一臺機器上,其他的前端機器可以共享該服務。
Session State只能存放在一臺機器上嗎?
不,不是的,如果需要的話可以在多臺機器上保留。Session State可以在多臺機器上存儲,也可以有多臺機器的前端去訪問那些存儲信息。
我是一個用戶,我正在訪問一臺機器,我的Session State留在這臺機器上,如果我下一次要訪問另一臺機器,Session State中的數(shù)據(jù)可以共享嗎?
是的,這種工作方式是WEB群組最典型的工作方式。一個用戶你可以訪問機器A,等一會兒,你又會訪問機器B,你的Session State保留在另外一臺獨立的機器上。Session State既可以運行在我們的Session State provider上面也可以運行在SQL Server上面,我們有一種方式可以讓SQL Server成為Session信息的服務器。但是,前端的這兩臺機器,也可以是多臺機器,都可以訪問同樣的Session State。
這樣看來,我們可以通過這種方式共享數(shù)據(jù)了。
是的,正確。但是你可以想象一旦你擁有這種Session State,與你的ASP代碼不在一個進程中運行的Session State,無論你的ASP程序遇到下面什么樣的問題,程序崩潰、我們終止了你的代碼運行、我們檢測到某種資源漏洞或者鎖定、我們所配置的一些事情(例如一小時一次)遇到問題時,你所有的Session依然是安全的。因為,你將你的Session State保存在另外一臺獨立的機器上了。
如果你只有一臺機器,你也可以利用Session State的這種特點,你可以讓他運行的進程與你的代碼運行的進程不同,因此,只要進程到來時,他們就可以訪問在安全保護進程中的Session State。
正如我們剛才提到的,Session State最重要的幾個好處是:(1)可靠性。你不用再擔心你的應用程序崩潰或者一個用戶數(shù)據(jù)丟失這樣的事情發(fā)生。(2)第二個好處是,現(xiàn)在,你的應用程序不必再局限于一臺機器。如果你使用了Session State ,你的確可以將你的應用擴展到更多臺的機器上,這樣,就真的沒有什么條件能夠限制你了,也就是說,你不必再擔心你的應用程序能夠在多大范圍內(nèi)或者能夠為多少用戶提供正常服務這樣的問題。
聽了上面的講解,我們好像做了兩種不同的事情,一個是ASP.NET提供了許多新的功能和性能,人們可以充分利用這些新的特點;另外一個方面是,在這些功能和性能的后面,ASP.NET做了許多額外的工作,使得這些特征和功能發(fā)揮了更大的作用。
是這樣的
對我來說,如果我已經(jīng)有了一個ASP的WEB站點,如果他已經(jīng)為我提供了滿意的結(jié)果,我不想再改變程序中的任何東西,如果我將站點的整個框架更新到新的ASP.NET上或者類似的東西上,那么就意味著我的站點獲得更多的魯棒性。
是這樣的,你說的的確是一個很有趣的觀點。我確信,如果你是那個用戶,你說那個站點的應用程序運行良好,我的確不想做任何改變,如果我需要升級到ASP.NET框架的時候,我只想在我的機器上安裝這個ASP.NET即可。如果你這樣做了,我們并不會替換你的機器上任何的ASP代碼,因此ASP與ASP.NET運行在一臺機器上。但是,你實際上將不得不將運行環(huán)境讓位給ASP.NET,并且重新配置你的機器。盡管作這樣的事情沒有什么難的,但是你需要告訴我們你想讓ASP.NET運行ASP的那些程序。因為,如果一個機器里已經(jīng)存在了多個應用程序的時候,你再想安裝一個新的運行環(huán)境,新的編譯環(huán)境,和所有新的.NET的那些東西時,我們不能完全保證你的每個應用程序在升級后的環(huán)境中都運行良好,都帶給你同樣的性能。做服務器程序的開發(fā)人員將會用很長的時間調(diào)試他們的程序,以確保程序正常工作。
如果我是按照你們說的去做,那么,好,我安裝了ASP.NET,我標記了我的文件,并且告訴他們:現(xiàn)在你們運行在ASP.NET的環(huán)境中,就算是我根本沒有對文件作任何改變,我是否可以獲得具有更高魯棒性和更好柔韌性的解決方案?
是的,你將獲得具有更高魯棒性和更好柔韌性的解決方案。不過,在這里我要提及的一個重要的事情是,我們當前的解決方案不是百分之百地與ASP兼容。眾所周知,盡管我們的ASP.NET與ASP之間具有非常非常的親密關(guān)系,但是,最近幾年里,當我們開發(fā)這個平臺的時候,由于若干的總總原因,我們不得不犧牲一些兼容性。但是人們根本不會感覺到這些。在ASP.NET中,我們獲得COOKIES的順序?qū)嶋H上稍稍發(fā)生了一些變化。這一切正如我們期望的那樣,不會有百分之百的兼容。不過最重要的是,無論發(fā)生了怎樣的變化,如果你安裝了ASP.NET后,你現(xiàn)有的代碼和你現(xiàn)有的網(wǎng)頁將依然會正常的工作。
從整體上看ASP.NET對你是有幫助的,但是由于它本身的一些小小的變化,你將不得不隨之作一些小小的調(diào)整。我們會有一些自動化的工具幫助你完成這一切。但是,對于大型的應用來講,毫無疑問,你要做一些改變。
讓我們再一次回顧一下理解你的應用程序架構(gòu)的一些關(guān)鍵的事情或者簡單看看那些新的事物
很好,這是一個很有意思的部分。這其實是一種移植工作。你可以將一個頁面,將你所掌握的技巧,將你能夠你所做的一切,將你寫的東西移植到ASP.NET上,你依然可以用同樣的技巧,同樣的技術(shù),但是你將獲得更高的性能。當人們開始了解這個平臺的時候,我推薦給人們的是應該了解這個平臺的所有特征。因為除了移植外,還有很多的新的特征。也可能不僅僅是移植的過程還有一點點重建的過程。例如,我們在前面提到了確認的過程,大多數(shù)的應用程序都可以用到不同程度的確認過程。但是,他將不再是“保留你原來的確認邏輯,并且讓他運行的更快一些”,而是,完全被我們的確認組件所替代。
許多人都已經(jīng)用ASP建立了他們自己的某種安全架構(gòu),他們可以用它來驗證登錄信息?,F(xiàn)在當他們知道ASP.NET帶有這種功能是,他們會說,這下可好了,我可以直接使用ASP.NET內(nèi)嵌的認證功能了,在也不用我自己編的那些東西,不再用Session State跟蹤用戶信息。
Caching是與性能相關(guān)的的一項重要的功能,我前面沒有提及,許多的開發(fā)人員非常努力并且使用了很多的非常好的技術(shù)試圖弄明白一個頁面的局部或者服務器上的整個一個頁面的運行結(jié)果,以便當兩個瀏覽器請求同一個特殊資源時,不必重新生成兩次,我只要使用cache中的版本就可以了。在ASP.NET中,我們提供了一個對cache的支持。
我想說的基本也就這些,但是我認為他們是值得花時間的,特別是你想快速開始時,在SDK中,我們有大約900來個例子,這是一個很大的數(shù)目,我們有一些很大的端到端的應用程序,一個電子商務的應用,一個建立類似INTRANET門戶框架的應用。我認為,認真研究這些應用程序,并且看看他們是如何構(gòu)建的是一件很值得做的事情。因為你會發(fā)現(xiàn)你找到了很多技巧,意想不到地減少了你寫代碼的數(shù)量。使你的代碼更干凈。我想,你將會突然發(fā)現(xiàn)那些的確難以管理的50、60行的代碼變成了5、6行清晰的代碼,幾周之后,你再回來看看時,一目了然。很容易弄清楚是什么意思。
小結(jié):
關(guān)于ASP.NET最重要的事情是,首先,他使得開發(fā)人員的效率大大地提高了。他使得應用程序和系統(tǒng)的可靠性大大地增強了,有許多東西使得應用程序真的很容易配置。例如,當你的應用程序正在運行時,如果你復制一個DLL時,他沒有被鎖定,這樣你的應用程序就可以平滑地移植到新版本上。舉這個例子是為了說明可以真正地提高性能、可靠性、可用性、可擴展性。我想,所有這些能力都實際上是系統(tǒng)中最重要的事情。除此之外,我們還增加了大量的新的功能。我知道有很多的人看著ASP從1.0,2。0,到3.0成長的,他們今天看到ASP.NET時候會說,嗷,對于server對象或者response 對象以及其他類似的東西還有三種不同的方法。這就是新特征帶給我們的巨大的財富。
[Page]
下面我們談一談開發(fā)人員如何快速地開始ASP.NET的程序設(shè)計。
你發(fā)現(xiàn)ASP.NET中什么東西比ASP更吸引人?
有些人說是配置,ASP.NET配置起來更容易嗎?因此,我想談論關(guān)于這個問題的一點內(nèi)容。我們的確發(fā)現(xiàn)ASP.NET的一個優(yōu)點是可以簡單地配置。由于ASP.NET的應用程序是由編譯過的代碼組成,所以不需要注冊DLL或者停止某些服務。例如,在今天的ASP環(huán)境中,如果在你的網(wǎng)站上,有一個非常重要的商業(yè)組件需要被一個功能更加強大的組件替換時,你將不得不暫停WEB站點的服務,以便使得DLL不被鎖定。然后替換該組件,重新在系統(tǒng)中注冊,重新啟動你的WEB站點,這樣做的結(jié)果是在某一段的時間里,你的站點將不能對外工作。然而,令人興奮的是在ASP.NET中,你不需要在做上面的任何工作,你在也不必考慮那個該死的regsrv32。你只需要將這個新的DLL放到與老的DLL系統(tǒng)的目錄下。當前訪問的新的DLL的請求仍然在工作,新的請求將會觸發(fā)新的DLL,這一切會持續(xù)到老的DLL完成所有的請求時為止。那時,新的DLL就會代替老的DLL,這一切不會引發(fā)停機,這一切只需要調(diào)用XCOPY的配置功能,這一切使得我們的工作更有效率,更加簡潔。
這樣做的好處是不用再考慮哪個DLL需要關(guān)閉,然后再關(guān)閉它;哪個DLL中有BUG。是否有一種方式可以使得當前應用的所有的DLL迅速的被關(guān)閉,還是必須要將WEB站點停掉。
對我來說,保留它前面的版本,后面的版本是一件很容易的事情。只需要利用XCOPY重新配置一下就可以了,那些DLL很快會被自己替換。
好了,除了前面所見的配置簡單的這個特性以外,你們還有那些優(yōu)點足以吸引ASP 程序員快速移植到ASP.NET環(huán)境中?
這個問題問得好,如果我是一個VB程序員,當我進入ASP編程環(huán)境時,我會發(fā)現(xiàn),他是如此熟悉,我樂意立刻在那里編制程序。我不用擔心那些腳本語言,不用再考慮那種從頭到尾都是線性的處理模型,我可以在ASP.NET中使用更新的邏輯關(guān)系,使用提供的更多新服務器組件,提供比ASP程序更多的功能。
確實是這樣的,ASP.NET節(jié)省了我們大量的的開發(fā)時間,你可以在同樣的環(huán)境下開發(fā)供ASP+頁面調(diào)用的DLL,并且可以安全的使用。然而,對大多數(shù)的開發(fā)者來講,最大的收益來自于他提供的caching功能。
我們都理解caching功能對于標準的web頁面的重要性,客戶端的caching可以使得頁面很快重現(xiàn),服務器端的caching存儲了一些已經(jīng)編譯過的代碼,可以提訪問的速度。
我們下面舉一個caching的例子,一個在線的商店,這是一個銷售CD的網(wǎng)上商店,在他的主頁面上,你列舉了一系列的商品。因此,你使用了數(shù)據(jù)庫存儲商品信息、價格信息、種類信息等。當ASP腳本訪問數(shù)據(jù)庫時,不可避免地會有時間延遲。但是,當你使用caching時,一些訪問過的信息將會留在caching中。當請求的信息在caching之內(nèi)被檢索的時候,caching中的頁面作為原頁面輸出,因此,你不必在訪問數(shù)據(jù)庫就可以獲得數(shù)據(jù),因為他們已經(jīng)在caching中了。.NET框架會一直監(jiān)視caching中的頁面,如果這些頁面相關(guān)的數(shù)據(jù)庫的信息發(fā)生了變化,他就會立即更新這些頁面。因此,你不必擔心得不到最新的數(shù)據(jù)信息。通過caching的設(shè)置功能你還可以設(shè)置caching的時間長度,規(guī)定他在多長時間內(nèi)定期更新caching中的內(nèi)容,你也可以在caching中緩存頁面的點擊數(shù)。總之,通過caching技術(shù),你實際上為你站點的用戶提供了快速獲得信息的可能性。在本質(zhì)上,他實際上直接獲取的是生成好的HTML頁面,從而避免了一系列的頁面生成的過程。
caching將真正幫助網(wǎng)站的開發(fā)人員調(diào)整網(wǎng)站的性能以及快速的相應客戶的請求。
是的。實際上你可以看到這樣的情形---網(wǎng)站服務器每秒鐘可以相應更多的點擊數(shù),因為用戶大部分的請求都落在caching中。
從開發(fā)人員的角度來看,如果他們在編寫第一個ASP.NET程序時,他們會遇到哪些大的困難?
我對您的話感到吃驚,從ASP到ASP.NET并沒有不可逾越的障礙。他們只是在一些細節(jié)上有所不同。當然有許多的是要引起注意的。例如,我們過去常用ASP與VB SCRIPT編寫程序,當我們想創(chuàng)建一個record set對象的時候,我們不得不SET一個變量等于record set。在ASP.NET中沒有SET這個參數(shù),直接就是變量等于ADO records set對象。所以,在ASP與ASP.NET之間僅有一些小的語法的差異,這些小的語法差異根本不會影響到頁面的性能,但是如果你將ASP程序移植到ASP.NET上時,你要注意這些小的差異。實際上,從ASP遷移到ASP.NET的代碼量是很少的,不必考慮將整個程序代碼移植,這兩者實際上是可以并存的。因此你不必強制將你的網(wǎng)站的程序立即移植到ASP.NET上,你可以在新的工作中逐漸采用新的ASP.NET技術(shù)。
我想,你仍然可以像你從前那樣聲明你所有的數(shù)據(jù)類型。你仍然可以使用Server.CreateObject,你仍然可以使用 DIM RS,定義一個record set對象,你仍然可以使用DIM RS AS NEW ADO record set這種方式,對嗎?
這只是我們的一種選擇,在我們最少量的移植級別里面,你實際上不用考慮ASP 與ASP.NET的區(qū)別。你仍然可以使用 DIM RS 的方式,并且用這種方式創(chuàng)建與數(shù)據(jù)及相關(guān)的對象。這兩者之間的主要區(qū)別是一個是用VB SCRIPT創(chuàng)建的對象,另一個是用VB創(chuàng)建的對象。
這么說,你們現(xiàn)在是已經(jīng)改變到一種擁有類型的開發(fā)語言平臺上了?
你說的很對,我們有數(shù)據(jù)類型了。我們現(xiàn)在更嚴格的進行應用程序的內(nèi)存管理,而不是將每一件事情能夠都看成是變量,我們現(xiàn)在可以將不同的事物看成string、 integer、a data set,因此我們可以更好地控制內(nèi)存的使用。
接下來,我們應該演示一些代碼用以解釋上面所說的一些東西。
好的。我們的第一個問題是移植問題。這是一個典型的ASP代碼的頁面,我們將從數(shù)據(jù)庫中取出數(shù)據(jù)放到表中。我們來看一下這些代碼,我們首先定義了我們的connection 和我們的 record set, 我們創(chuàng)建了這些對象,我們用SET關(guān)鍵字設(shè)置我們的record set 等于connection的執(zhí)行。接下來是一個DO WHILE 循環(huán),將數(shù)據(jù)庫中的信息顯示在頁面上。
<%
Dim con, rs
Set con = Server.CreateObject("ADODB.Connection")
con.Open "Provider=SQLOLEDB;server=(local);database=Northwind;UID=sa;PWD=;"
Set rs = con.Execute("SELECT ContactName, City FROM Customers")
%>
<html>
<body>
<table border="0">
<tr>
<td>ContactName</td>
<td>City</td>
</tr>
<%
Do While Not rs.EOF
%>
<tr>
<td><%=rs("ContactName")%></td>
<td><%=rs("City")%></td>
</tr>
<%
rs.MoveNext
Loop
%>
</table>
</body>
</html>
如果轉(zhuǎn)到.NET框架下,僅需要少量的移植工作。我們可以看見哪些東西已經(jīng)被改變了,哪些東西不能使用了。我們在Set con = Server.CreateObject("ADODB.Connection")和Set rs = con.Execute("SELECT ContactName, City FROM Customers")中所使用的set之類的關(guān)鍵字一去不復返了。但是在這里我要指出的是,在下面的代碼中,我們在rs("ContactName")和rs("City")的右邊添加了一個屬性Value。他的基本含義是,我們可以獲得指定行或者指定列的值。從ASP到ASP.NET也就這些改動,實際上有很少的變化,你可以看到ASP與ASP.NET代碼之間幾乎一樣,沒有什么特別大的變化。
<%
Dim con, rs
con = Server.CreateObject("ADODB.Connection")
con.Open("Provider=SQLOLEDB;server=(local);database=Northwind;UID=sa;PWD=;")
rs = con.Execute("SELECT ContactName, City FROM Customers")
%>
<html>
<body>
<table border="0">
<tr>
<td>ContactName</td>
<td>City</td>
</tr>
<%
Do While Not rs.EOF
%>
<tr>
<td><%=rs("ContactName").Value%></td>
<td><%=rs("City").Value%></td>
</tr>
<%
rs.MoveNext
Loop
%>
</table>
</body>
</html>
這是很吸引人的,那些SET關(guān)鍵字被去掉了,VALUE關(guān)鍵字被引入,代碼本身實際上沒有什么變化,因此只要你看看輸出結(jié)果,你就會發(fā)現(xiàn)他們基本上是一致的。但是,ASP.NET是運行在.NET框架下,他的頁面擴展名是.ASPX,當然我們在該頁面也可以實現(xiàn)CACHE的功能,只不過在這個程序中沒有用到罷了。如果我們將上面的實例進一步深入下去并且考慮應用.NET框架和ASP.NET框架所提供的一些更為便利的手段。例如,用managed providers來獲取數(shù)據(jù),那么我們將以入下面這個事例。我們依然工作在SQL 7.0上的NorthWind數(shù)據(jù)庫中。
.NET提供了一個重要手段是SQL managed provide,它可以直接連接到SQL上獲得數(shù)據(jù)而不必通過OLEDB這樣的東西,這種方式經(jīng)過實踐被認定是大大提高了訪問速度。我們可以看一下下面的代碼,他們使用純粹的VB而不是VBs編寫的。但是輸出的結(jié)果幾乎一樣讀。我們要做的事情是import 一些namespaces , System.Data,這樣我們就會有最基本的數(shù)據(jù)處理能力以及獲得對SQL managed provider訪問能力的 SQL namespace。這些代碼的風格與前面討論的C#的風格好象很一樣,那時我們使用C#來處理基于.NET架構(gòu)的各種類庫,現(xiàn)在我們所見到的在VB中的.NET類庫與C#中的類庫具有相同的風格。
這兩者之間的確是同一種風格。如果我用C#編寫,代碼會不同,但是namespace(名字空間)是一致的。對于編寫ASP.NET的程序,這兩種方法都是很好的。盡管某些類可能會有一些不同,但是我們可以僅僅修改幾個的地方,就可以將VB代碼快速移植成C#代碼。
實際上,許多代碼將不會被改變(一直保留下來)。例如,SQL connection 字符串只需要改變一點點, SQL select statement 字符串不會有什么改變。在這里,我們強調(diào)一下,對于connection 字符串我們不再使用 ADO provider,不再使用SQL OLEDB作為ADO provider,因為我們使用了SQL managed provider,因此我們提倡使用SQL7.0以上的版本,他能給我們更好的性能。我們創(chuàng)建一個data set用以保存我們的數(shù)據(jù)以及后來訪問的結(jié)果。我們用SQLDataSetCommand檢索SELECT的結(jié)果,并返回頁面,將他們插入到data set中,我們命名這個表為Customers。因此,我們現(xiàn)在有一個data set對象,他包含了一個Customers表。如果需要的話,我們可以加入更多的表和更多的關(guān)系。與ADO records set不同的是,我們現(xiàn)在可以處理更大的事情,我們可以將整張大表分成若干個小表,而他們之間的關(guān)系去保持不變,這種方式有利于更大的程序應用開發(fā)。.
<head>
<script runat="server">
Sub Page_Load(Source As Object, E As EventArgs)
Dim ds As New DataSet
Dim dsc As SQLDataSetCommand
dsc = New SQLDataSetCommand("SELECT ContactName, City FROM Customers", _
"server=localhost;database=Northwind;UID=sa;PWD=;")
dsc.FillDataSet(ds, "Customers")
dgCustomers.DataSource = ds.Tables("Customers").DefaultView
dgCustomers.DataBind()
End Sub
</script>
</head>
.
接下來,我們跳過幾行代碼,直接顯示與ASP data grid server控件相關(guān)的代碼。ASP data grid server的作用是提供一個最基本的表。我們要做的唯一的一件事情是告訴他我們要在服務器端運行他,他是服務器端的控件。接下來我們設(shè)置the border寬度為零 ,因為上面的例子中border="0"。此外,我們新加了一個屬性,他用來改變items的背景色。他用來標識在ASP表中不同表格項的顏色,這樣便于區(qū)分。當然,你要寫很多的代碼,用循環(huán)的方式改變每一個項目的背景色,在這里我們簡化一下工作,只是標志這個屬性。他表現(xiàn)的色彩是淺灰色。
<body>
<asp:DataGrid id="dgCustomers" runat="server"
AlternatingItemStyle-BackColor="#CCCCCC"
BorderWidth="0"
/>
</body>
</html>
[Page]
我注意到這里有一個ASP的tag,他的作用是標示一個控件嗎?
是的,他的前綴,ASP的前綴。表明這是一個ASP的控件,后面的部分表示這是一個服務器端的控件,是在.NET框架下定義的。我么也可以形成我們自己的控件并且給他們一個獨立的前綴,實際上我們已經(jīng)為我們的站點定義了一些我們內(nèi)部使用的控件。好,現(xiàn)在,我們看一下這個程序的運行結(jié)果,這個運行結(jié)果與上面的結(jié)果相似,所不同的是數(shù)據(jù)庫訪問依賴的是SQL provider,另外,增加了一個小小的定義背景色的屬性。我們這個程序與上面的程序的設(shè)計基本相同,但是卻很容易添加這樣的屬性,我們每天都用這樣的方式處理成噸的表格、添加許多種其他的屬性。實際上,這也是使用服務器端控件的好處,他能使我們更容易在HTML中表現(xiàn)方法和屬性,他使得編程工作更容易,更快捷。
因此,我們看見這段代碼與前一段代碼的主要區(qū)別是他不需要讓程序員編寫遍歷整個records set的WHILE循環(huán)。也不需要在HTML中的某個合適的位置顯示結(jié)果。你可以很簡單的生成一個表,然后告訴他:你的值來源于records set。
對的,是這樣的。剛才有一件事情我跳過去了,就是你說的那件事情。我們回過頭來在看一下那段代碼。我們用名字調(diào)用這些data grid并且將他們捆綁到來源于data set的結(jié)果以及 data set.中的一個特定的表格,接下來的工作就可以使用這些數(shù)據(jù)了。
dgCustomers.DataBind()
上面的例子是一個將一個很簡單的表格顯示在屏幕上的程序,這種表現(xiàn)方式看起來是簡單有效的,但是,對于一個比較復雜的表格,還要進行很多次的復雜運算以及顯示更為花哨的字符串等要求的程序仍然可以用同樣的方式遍歷整個records set嗎?
當然可以,這實際上是.NET服務器端控件的一大特點。我們很容易對datagrid做一些客戶化的定制工作,因為,他是一個很基本的原始表格。也可以對datalist做一些客戶化的工作,使他的每一行或者每一個單元對應一條記錄。我們可以通過循環(huán)的方式用模版定制他的每一個重復的地方,有一種repeater數(shù)據(jù)控件,允許完全用模版定制他的每一步,因此,我們有一個頭模版和一個一個尾模版分別定義了模版的起始和模版的終止。我們還有一些item 模版和一些 alternating item 模版,他們可以為我們提供更多個性化的設(shè)計。我們還有很多的好東西放到了網(wǎng)站ASPNextGen.com上面,在那里我們用data repeater作了許多的工作,同時也提供了更多的客戶化的輸出。
太好了,太好了,我可以像現(xiàn)出那些激動人心的功能,剛才你提到了你可以開發(fā)你自己的控件放到頁面上去,如果現(xiàn)在的table grid控件不能夠滿足你的需求,你可以寫一些自己的代碼并將改造過的控件應用到任何你想要用到的地方。
是的,不過最有意思的是,你不僅僅可以定制你自己編寫的控件,而且還可以擴展服務器端組件的功能例如我可以擴展data grid功能,以滿足我自己的特殊的需求。做這些事情,我們可以使用我們完全編譯的服務器端控件,也可以使用一種另外一種控件---用戶控件(user control)。用戶控件是一種中間件,他介于頁面控件和服務器控件之間,你可以通過用戶控件顯示方法和屬性,也可以表現(xiàn)更多的功能。
開發(fā)這些額外的用戶控件要比單純寫一個ASP的程序復雜,但是可以獲得更加強大的功能,是這樣的嗎?
你提了一個好問題。開發(fā)用戶控件的復雜性會令你非常吃驚的。如果你創(chuàng)建一個ASPC類型的文件,并且寫一些HTML在文件里面,你就已經(jīng)擁有了一個最簡單的用戶控件。如果你想讓一個頁面內(nèi)容包含在每一個頁面里面,你可以將這個頁面定義為一個HEADER,像使用INCLUDE文件那樣使用它。你可以很容易在你的用戶控件中包含HTML的結(jié)果。因此,最簡單的用戶控件程序就是HTML程序。此外,如果我想用同樣的方式在這些頁面中加入一些代碼,我可以在用戶控件中提供一些功能并且暴露一些屬性。例如,我想在每個頁面上設(shè)置我的用戶控件背景色,我可以在我的用戶控件中暴露背景色屬性,
但是,從另外一個角度來看,這將會是一件相當復雜的工作。例如,你要做一個服務器的控件,一個 data grid 控件不會很容易地。因為它涉及到NET框架中的一些東西。有一種創(chuàng)建此控件的方法,必須發(fā)生在提交方法之前,發(fā)生在子控件被提交頁面之前。因此,如果你要做數(shù)據(jù)綁定或者設(shè)置背景色等工作,你就應該在合適的時間內(nèi)完成,否則當該頁面被提交時,你將得不到你想要的東西。如果從這些方面來看,做這種控件將會是是一件復雜的事情。我曾經(jīng)做過一個控件,一個ad rotator控件。它相當于.NET服務器控件的一個子控件。它可以綁定到一個XML文件上,該文件完成的是當頁面被訪問時在你的的站點上顯示不同的廣告。在他的存儲表單里面,有一個圖像的URL指向圖像文件,一個導航URL,當你點擊廣告時,該URL將你帶到與該廣告相關(guān)的那個頁面。這個頁面是不固定的,因為它淶源于不同的廠商。該頁面可以是圖像,也可以是文字。
到目前為止他還沒有提供給我們找到那個BANNER顯示了多少次的方法。因此,我在這個控件中加入了這個屬性,就像是放入了一個倒計時器。因此你可以在XML文件中放入一個默認值,設(shè)置該默認值為一個人100或者另一個人200等。你的默認值會逐漸遞減直到為零。此時圖像將不再顯示了。我想建立這種控件還是會花費的一定的時間的。
無論你是一個經(jīng)驗豐富的ASP開發(fā)人員還是一個經(jīng)驗不豐富的ASP開發(fā)人員,你都可以非常容易地做一個很基本的用戶控件。但是,如果沒有今天的技術(shù),你可能要花很大的精力,可能要深入更底層去做許多工作,并且這一切還取決于你的經(jīng)驗豐富程度,以及系統(tǒng)提供的相應函數(shù)的豐富程度。
這有點像用匯編寫一個HELLO WORLD的程序,那會是一個很復雜的過程。但是用C語言寫這個程序則很容易。這并不意味著用C語言寫所有程序都非常容易。但是,看起來好像這種方式擴大了開發(fā)人員的開發(fā)能力。因此,如果一個開發(fā)人員想開發(fā)一些運行在他們WEB服務器上的復雜的應用程序,他們要在ASP.NET上做很多的工作。
你認為ASP.NET未來將提供什么樣的功能?給予ASP.NET的WEB SERVICE 將會被人們設(shè)計成什么樣子的?
那些都是無止境的。不過信用卡的認證將會是一個巨大的功能需求。輸入卡號、名字和地址,然后讓WEB SERVICE返回每一部分的布爾值YES或者NO,接下來要么認證成功進行交易要么由于認證失敗而退出。當然也可以返回名字拼寫錯誤、認證完成的消息或者一個郵政編碼是否有效等結(jié)果。
在這個功能上就這么多的東西,我們還有一些 WEB SERVICE的例子在我們的站點上,他們都是很基本的應用程序,你可以調(diào)用他們,他們都是我們放到網(wǎng)站上的一些教程程序,他們可以給你足夠的你想要的信息。關(guān)于ASP.NET和WEB SERVICE,我認為會有一個巨大的市場和他們相伴而行。你應該知道一個叫Amazon.com的公司,他們做了許多將服務連接起來的工作。人們可以在他們自己的網(wǎng)站上銷售書,但是書的信息卻通過Amazon.com表現(xiàn)出來,那些銷售書的人得到了信譽。這可以看成是WEB SERVICE的一個典型的例子。這個例子很好的表現(xiàn)了當你瀏覽一個書的列表時候,如何讓這些書顯示出來?無論是神秘小說還是StephenKing的小說,都可以通過WEB SERVICE返回結(jié)果。
Amazon.com實際上并不是你要訪問的站點,但是你卻可以從哪里得到圖像、得到標題、得到書的列表信息。你可以用你喜歡的方式顯示他們。
是的,WEB SERVICE的優(yōu)點是他是基于xml的,因此你可以用這種方式得到信息,并且用你喜歡的方式處理信息。只要能夠分析并處理xml信息,你就可以使用web SERVICE,因此你沒有必要一定要跑到一個.net的web站點上去使用web SERVICE。
-------------
=---=================================================
什么是做.NET程序最重要的事情?如果你給我們觀眾一些指點,他們將會更快地接受ASP.NET。
好的。句法這樣的東西,你已經(jīng)用了很多次了。你只需要學習它們之間的不同就可以了。如果你遇到完全不同的處理方式,你就不必按照過去的方式去做了,因為你做腳本工作已經(jīng)很長時間了,所以會有很多不同的東西需要學習。其次,關(guān)于assembly,namespace這些概念都要弄清楚。接下來,是語言的問題。我曾經(jīng)是一個VB程序員,現(xiàn)在我是一個C#程序員,我喜歡C#,它是一種很,好的語言。如果有20行的VB程序C#5行就可以解決問題。但是對于COM,.NET框架的已經(jīng)為你處理了那些常見的工作,所以你只需要編寫一些業(yè)務邏輯的代碼就可以了。
你說的是理解“什么是Assembly?“
是的,Assembly,namespaces、相關(guān)背景、整個.NET架構(gòu),都要理解。
理解namespaces和Assembly的關(guān)鍵是理解他們的概念。你理解它們越多,你對架構(gòu)的理解就越深入。主要理解它們是什么和你為什么需要它們。我認為一些ASP開發(fā)者,或是其他一些沒有任何開發(fā)背景的人進入ASP領(lǐng)域的原因是因為ASP非常好理解,它很容易接受并且你可按照自己的方法去做。如果要變換到.NET框架還是需要一些努力。如果你有開發(fā)背景就比較容易理解,因為你熟悉相關(guān)概念,熟悉數(shù)據(jù)格式,并且你知道過程調(diào)用這些東西,對于新涉入的人來說就需要做更多的工作。那些經(jīng)常做腳本開發(fā)的工作人員需要做更多的努力。
ASP編程模型在整個WEB頁面上使用的都是腳本語言,無論是客戶端腳本還是服務器端腳本都使得程序顯得非常凌亂。你經(jīng)常要更改的一些代碼或者不得不四處修改一番?,F(xiàn)在,ASP.NET好像已經(jīng)為你提供了更加規(guī)范的開發(fā)方式。
你現(xiàn)在能完全分離出你的代碼。你可以有HTML代碼和程序代碼,能處理數(shù)據(jù)和得到動人效果。
你提到你是個C#程序員,ASP.NET在頁面上支持C#。我們看到SQL Server的那個例子,你使用的是VB,不是VB script,你是不是在頁面上也能用c#開發(fā)。
正確。或者是EIFFEL、VB、COBOL其他任何一種.NET支持的語言。你可以利用這些語言做你想做的任何事情,但是最最重要的,你不再被什么條框限制。比如做ASP程序,你只能選擇VB script或者javaScript這些東西?,F(xiàn)在則不同了,你熟悉什么語言?你更喜歡用什么語言開發(fā)?你就可以使用什么語言開發(fā).net的程序。如果你喜歡COBOL,你會感覺到在.NET框架下做程序更順手、更有意思。我想這種革新對很多使用其他語言的人都開啟了方便之門。我曾經(jīng)和很多C++項目開發(fā)者工作過,我不想說他們恐懼ASP,但是他們確實不喜歡使用VBScript這些東西,現(xiàn)在好了,他們不必再為此煩惱,他們可以使用他們最喜歡的語言開發(fā)。
是的。在我們即將結(jié)束我們的談話時,你還有什么話要對我們的聽眾說嗎?能對他們深入學習并使用ASP.NET有些益處。
熱愛它,學習它,盡情使用它,我想這是關(guān)鍵問題。ASP.NET確實是偉大的工具。它使網(wǎng)站的開發(fā)更為容易。并且我想,正如上面提到的,它變得更有意思,更順利、更容易。所以我想說,如果你打算學習ASP.Net,現(xiàn)在就開始,你會精通它并且感到充滿快樂。