維護ASP的工作階段狀態

來源:互聯網
上載者:User
HTTP是一種無狀態協議。當客戶機向伺服器發送一個請求時,伺服器並不知道這是客戶機的第1個還是第42個請求。這對ASP開發來說無異帶來了比較嚴重的問題,因為經常有必要給特定的客戶機關聯伺服器方變數。比方說,網站在向我發送我訂購的Jethro Tull CD同時向其他人發送Barry Manilow CD就是因為這一關聯的重要作用。ASP通過稱為會話ID的唯一的客戶標識符處理這種關聯關係,當客戶在開始他或她的瀏覽器會話時就會被分配這種會話ID。

現在讓我們看看傳統的ASP和現代的ASP.NET圍繞會話ID的使用而存在的一些問題。然後,我們討論下運行多個Web伺服器時的會話問題。
什麼是會話ID

  
會話ID是一種唯一標識當前訪問伺服器的客戶的唯讀值。在經典的ASP環境下,會話ID是按照順序方式被分配的,也就是說,會話ID 706616433之後跟著會話 ID 706616434等等。傳統的ASP會話ID以加密的、非持久存在的cookie形式儲存在客戶機上。例如,會話ID 706616434就可能作為cookie ASPSESSIONIDGQQGQGCS=JHMBOBKCBINEHLPKJHOPABBE儲存在客戶機上。

ASP.NET下的會話ID有所變化。在使用 ASP.NET 時,會話ID是由URL合法ASCII字元組成的一個120位字串。根據微軟文檔的說明,產生會話 ID 值採用了保證其唯一性的演算法,從而避免出現兩個客戶試圖採用同一ID時出現的會話衝突。另外,會話ID的隨機性使得確定現有會話的ID變得非常困難從而帶來了額外的安全性。同傳統ASP一樣,ASP.NET的會話ID通常也作為非持久儲存的cookie儲存在客戶機上。這種cookie的格式同傳統ASP相比稍有變化,例如,asp.net_sessionid=jhmbobkcbinehlpkjhopabbe。

除了維持狀態的傳統型的、非持久儲存的cookie的方法之外,ASP.NET還支援一種不採用cookie的工作階段狀態維持模式。在啟用無cookie模式的情況下,ASP.NET在發送回客戶機的URL中嵌入會話ID。這樣就為使用不支援cookie或禁用cookie瀏覽器的客戶提供了工作階段狀態堅持。考慮到利用cookie跟蹤客戶資訊的舉動,我們有理由對無Cookie模式保持高度的關注。

如何使用會話ID
客戶每發出一個請求,包含加密會話ID的cookie在存在的情況下即被發送給伺服器。伺服器隨後確定cookie所關聯的會話ID並恢複關聯該客戶的所有會話變數。如果cookie不存在就會產生一個新的會話ID,同時加密的會話ID cookie則被發送給客戶機。這樣就能讓ASP跟蹤訪問網站的單個客戶了。同時,以上機制還促使ASP建立伺服器方會話變數同單一會話的關聯關係。會話變數則被劃分為兩種類型:

內容集合
靜態對象(StaticObject)集合
ASP和ASP.NET下的內容集合(Contents Collection)會話變數都根據會話ID關聯特定的客戶。這些變數其實就是一個聯合數組,類似於Visual Basic的集合(Collection)對象。會話變數的原理完全一樣;唯一的本質差別是它們同一個特定會話相聯絡。而集合對象則可以通過唯一鍵儲存和檢索任何類型的數群組成員。

靜態對象(StaticObject)集合包含了會話範圍內、用GLOBAL.ASA的<OBJECT>標籤添加到應用程式中所有對象。同內容集合一樣,StaticObject集合也是一個聯合數組,其訪問方式也相同。不過,StaticObject集合僅僅包含了用<OBJECT>執行個體化的對象而並不包含那些用Server.CreateObject方法執行個體化的對象。

一個客戶就只有一個會話ID嗎
對單一Web伺服器而言,維護狀態在任何情況下都是自動的。客戶能得到而且只能得到唯一的一個會話ID,而且,只要網站上客戶保持在活動狀態,會話資訊就會受到伺服器的維持。然而,如果Web伺服器超過一個,或者單獨的應用程式位於某一虛擬目錄下而該目錄又駐留在其他應用程式的虛擬目錄下時,維持狀態就變得更複雜了。

在分配會話ID時,每個伺服器都是獨立進行操作的。因為這一緣故,Web伺服器A就並不知道Web伺服器B已經把會話ID 706616434分配給了某一客戶。因此,如果Web伺服器A收到具有會話ID 706616434的客戶請求,這一請求會被當作會話逾時進行處理,Web伺服器A隨即分配一個新的會話ID。在發生這種情況時,客戶在Web伺服器B上就失去了自己的狀態,而且在可能發生重複操作的情況下必須從頭開始。避免出現這一問題方法之一就是保證客戶的所有請求都被發送給了同一伺服器。

在虛擬目錄下運行應用程式是實現同一Web伺服器上隔離運行多個應用程式的方法之一。但是你得記住,當某一個應用程式調用另一應用程式時就會產生新的會話ID。這樣就會丟棄第1個會話 ID及其關聯儲存的所有會話變數。取決於應用程式的具體情況,狀態的丟失可能並不成為問題,但在偵錯工作階段時對此問題必須有足夠的認識。

小結
ASP足以應對建立持久的Web應用程式所面臨的最大挑戰??維護狀態。ASP的狀態維護機制令開發人員無須創造自己專有的狀態維護機制就能開發出滿意的應用程式。使用ASP、事先周密計劃再加上努力的工作就可能建立出穩固的持久性應用程式。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.