作 者 : 青蘋果工作室 本文點擊次數:277
本文是編譯稿件,原文出處:http://www.asptoday.com/articles/19990820.htm
如果你不多加小心,非常相似的情況會發生在web 應用程序上。所以,開發人員需要特別留意可 伸縮性和容錯問題,在設計應用程序時應該能夠適應未來的發展。維護用戶狀態是一個應用程序 可伸縮性和容錯的組成部分,你在站點設計階段所做的決定對于將來站點的成功至關重要。
不對某些類型的狀態進行維護,一個web 應用程序是不能存在的。比如,一個在線購物應用程序必須 要記住用戶累積的定單,當用戶在站點中一頁一頁地前進時,必須要往他們的購物筐中添加項目。 HTTP,客戶機與所有web應用程序運行的服務器之間的連接,是一種無狀態的協議。用戶所請求的 每一頁都是被獨立地處理的。所以web應用程序必須要有一些東西、一些地方來記住用戶的信息。
從用戶到達某一頁面的時刻開始,到他離開這一頁面的時候,在他的活動過程中,活動服務器頁 都使用允許用戶與web站點之間進行交互作用的Session對象(或者等“租用時間到”后自動放棄 Session)。你只需要賦值:
Session( "numItems" ) = 3
Response.Write Session("numItems")
我相信,Session對象從某些方面說是傻瓜型的,因為它允許各種臃腫的編程---開發人員什么時 候想創建變量都可以,而且沒有數據類型的限制。這樣一來就很難發現Bug,而且如果有許多人一起做 一個項目的話就更糟糕了。一方面是協助和支持了臃腫編程法,另一方面Session對象還有一個 問題--可伸縮性和容錯問題。
通常,測量一個web 應用程序的方法是用使用一系列的robin DNS在多個web 服務器上維護應用程序, 或使用一個負載平衡路由器來分配從客戶端到其中一個web 服務器的請求。但是,一旦用戶用web服務器 開始了一個ASP Session ,以后的所有請求就都要回到這個web 服務器,這就是說,如果這個服務器 關機了,用戶就丟失了他們的session,如果服務器超載了,性能問題就出現了。有一個解決的辦法: 不要使用Session 對象。
還有其它方法維護用戶狀態。你可以用隱含結構或表單將它們存儲在客戶端,但是我想,這樣你就需要 一個安全的HTTP或者是冒將用戶信息暴露給外界的風險。畢竟你是在客戶端和服務器之間移動著多于 必要的數據。
你可以把Session 數據從應用程序本身轉移開,從不同的服務器驅動它。就象數據庫負責保持數據一樣, 你需要另一種類型的服務器來管理動態數據。你可以有許多個從動態數據服務器驅動的web 服務器和 一個用在容錯方面的動態數據服務器的復制品。或許,這個奇妙的動態數據服務器可以在站點服務器 上用Membership 服務器和一個ActiveX User Object (AUO)來執行。有關AUO的介紹可以參考 Active User Objects & The Membership Directory。
在你將AUO用于Session 數據之前,你必須已經具有一個配置了AUO的Membership服務器,并且分配給了一個 web 站點。這些準備好之后,還需要對Membership 目錄和AUO做進一步的配置。
配置AUO
將AUO用于Session 狀態的最困難的部分是配置它--并不是真的困難,而是在開始使用它之前要做一點 額外的工作。通過創建一個類和屬性來定義狀態信息看起來是什么樣子,需要為類的例示設置存儲的 地方。步驟是:
定義你所想要的Session 狀態的屬性。
為session 狀態數據創建或選擇一個類。
為動態數據創建一個容器。
配置一個第二AUO供應器。
在面向對象的領域內將一個屬性看成是一個類的成員是有意義的。你必須將一個數據類型與每個屬性 聯系起來,比如說,維護購物筐中包含的項目個數的購物筐類作為numeric 屬性。用站點服務器的 MMC把所有的屬性增加到Membership 服務器的計劃中。
定義了所有屬性之后,就要把它們與一個類聯系起來--一個類的例示作為一個對象--每個對象可以有 它自己的屬性值。如果你已經有了一個用來代表Session 狀態的類,就可以向它增加屬性。否則你就 需要用Membership 目錄管理器來創建一個新的類來代表Session 狀態。在我們的例子中將使用一個 名為SessionStateClass的類。
現在你需要創建一個第二AUO供應器,其中包含主AUO供應器的輔助數據。它可以是一個ODBC兼容數據庫、 其它目錄服務或者Membership 目錄中的另一個容器。在這個例子中,輔助數據是Session 狀態信息, 存儲在membership 目錄中的一個容器內。
所以,在membership 根目錄下創建容納動態session 信息的容器并且命名它為ou=SessionStateData。 第二AUO供應器使用SessionStateData 容器來存儲數據。用MMC創建一個有SessionState的第二AUO供 應器。它應該具有以下屬性:
ADS path: computername:LDAPport/o=yourDirectory/ou=SessionStateData
Schema path: computername:LDAPport/o=yourDirectory/ou=Admin/cn=Schema/cn=SessionStateClass
現在你已經可以用AUO來存儲session 信息了。雖然這看起來有點復雜,但是你所做的就是創建和例示 一個存在于Membership 目錄范圍內的對象:定義一個類,它具有代表用戶session 狀態的屬性(或 成分)。每個用戶都會得到這個類的一個例示(或對象)。所以現在我們讓AUO開始工作。
設置AUO session 狀態
作 者 : 青蘋果工作室 本文點擊次數:277
現在第二AUO供應器已經準備好存儲動態數據,現在需要設置一個屬性的一個值。首先給請求web 頁面 的用戶約定一個對象:
Set objUser = Server.CreateObject("Membership.UserObjects")
僅僅通過引用你就可以存取任何靜態屬性。所以,要顯示公共名稱你要這樣做:
Response.Write "Your login: " + objUser.cn
要設置動態信息,必須確保對象實際存在。因為它是個動態對象,所以你不能自動假設它存在。
If Not IsArray(objUser("SessionState").objectClass) Then
objUser("SessionState").objectClass =
Array("SessionState", "dynamicObject")
End If
然后設置一個存在時間值。這個時間過去后,對象就會終止并消失。在設置AUO Session 對象的任何 其它屬性之前必須調用SetInfo。
objUser("SessionState").entryTTL = 900 '' specified in seconds
objUser("SessionState").SetInfo
最后,你可以設置值了。這里我設置一個定義為numItems的屬性。注意這個屬性必須存在于計劃中, 并且所賦的值必須符合計劃中的數據類型。
objUser( "SessionState" ).numItems = 3
objUser( "SessionState" ).SetInfo
你可以試著用一個不存在的屬性,或者賦一個錯誤類型的值,看看你所得到的錯誤信息。
訪問AUO Session 狀態
我把最簡單的例子留到了最后。訪問屬性的值與訪問任何第二AUO供應器信息是一樣的。指定用戶對 象、第二AUO供應器名、屬性名。
Response.Write objUser("SessionState").numItems
離開你的書桌,等待對象終止的時間到,然后再回來刷新頁面以證實對象確實是動態的。如果對象 已經終止了,就不能顯示任何東西了。
Session 和AUO 對象之間的區別
你可能已經注意到在使用AUO屬性之前既要定義也要復制它們,我認為這就是相對于Session 對象的 最大優越之處。它強迫各個開發人員事先進行更多的設計,為多個人員共同開發的項目創建一個變量 聲明的集中區域,這比讓Session 變量分散在ASP文件各處要實用得多。
還有許多數據處理的可能性。可以使用ADSI 來訪問存儲Session 狀態的組,然后在成組的用戶及他們 的屬性上進行各種顯示處理,如哪些人在購買、他們取消了什么、一天的什么時間他們買什么東西等。
結論
所以不要成為你的成功的犧牲品--構造你的ASP應用程序,使它具有伸縮性和容錯能力。伸縮性和容錯 能力的關鍵一方面是維護用戶session 狀態信息的策略。如果你正在使用站點服務器,那么ActiveX 用戶對象就是維護用戶狀態信息的很好的方式。