ASP.NET溫故而知新學習系列之ASP.NET中的狀態—基於伺服器端的狀態管理Session(二)

來源:互聯網
上載者:User

  前言

  我們在前篇“ASP.NET溫故而知新學習系列之ASP.NET中的狀態—1-狀態管理概述”中講到HTTP協議是個“無狀態”的協議,當你從一個頁面跳轉到另外一個頁面,它是不會儲存資料的,但是我們需要資料如何從一個頁面傳遞到另一個頁面,以及在好多頁面當中共用一些資料,為了允許使用者通過請求儲存狀態資訊,ASP.NET提供了Session儲存機制,這些Session變數按照每個使用者被儲存起來,在ASP中你只能把Session變數暫時儲存在Web伺服器的記憶體裡,但是這個方法已經證明了在擴充性和依賴性上的不足

  閱讀目錄

  一:ASP中Session儲存在Web伺服器的記憶體中存在的三個問題

  二:ASP.NET允許三種模式把Session變數儲存在三個不同的地方

  三:在SQLServer資料庫裡面儲存Session變數的優點

  四:我們下面就來探討第三種這種最好的儲存模式

  五:執行個體

  一:ASP中Session儲存在Web伺服器的記憶體中存在的三個問題

  1:這種是最容易丟失的,進程的回收、伺服器處理序的崩潰,都會導致你網站的訪客無緣無故被退出登入。

  2:它讓伺服器超負荷,影響了伺服器的效能

    Session變數根據每個使用者產生,當它們都儲存在Web伺服器的記憶體中,想象一個千萬使用者的網站,由於巨大的使用者數量,Web伺服器儲存的活躍Session變數的數目也是非常巨大的,也就意味著你的Web伺服器的記憶體中儲存了非常多的Session資料,如果不斷對伺服器增加負載,它有可能飽和,造成整體應用程式效能上的不良影響。

  3:它不能有效應用Web伺服器群

    Web伺服器群是指一組網路伺服器並行運行,伺服器群裡的每個Web伺服器都有你網站的一個鏡像,你網站的流通負載平均分配到到每個Web伺服器上,從而達到Server Load Balancer,而在Web伺服器記憶體裡儲存的Session變數會阻止Web伺服器群的建立。

    假設有三個Web伺服器Server1,Server2,Server3,它們並行的串連在一起接受使用者的請求,當有個請求Request1來到Web伺服器群,根據Server Load Balancer邏輯判斷,Server2,Server3都因為有其他的任務沒有空閑,但是Server1有空閑可以處理這個請求,那麼請求Request1會被送到Server1進行處理,現在,想象在處理這個請求過程當中,你在Server1的記憶體中儲存了某個Session變數,此時一切安好,過了一會,同樣的使用者有了另外一個請求Request2,這個請求需要上一個請求儲存的Session變數,但是此時Server1被一些任務使用著,而Server2,Server3卻處於閒置狀態,根據Server Load Balancer的原則,Request2將會被送到Server2進行處理,但是Server2怎麼得到上個請求的Session變數呢,畢竟Session變數儲存在和Server2沒有任何關聯的Server1的記憶體中,這就意味著Request2仍然得等待Server1的空閑,這樣很顯然就造成了Server2,Server3的浪費也就造成了Web伺服器群的浪費。

  二:ASP.NET允許三種模式把Session變數儲存在三個不同的地方

  1:InProc

    網站伺服器的記憶體中也是進程中儲存

  2:StateServer

    在一台專門存放Session變數的伺服器中儲存,也叫Session狀態資訊儲存伺服器,它是伺服器上的一個系統服務,如果您已經開啟了這項系統服務,即可在工作管理員中可以查看到名為aspnet_state.exe的進程

      

  3:SQLServer

    在一個SQL Server的資料庫裡面儲存

  三:在SQLServer資料庫裡面儲存Session變數的優點

  1:可靠性

    因為資料是很真實的儲存在一個真實的資料庫裡面,比其他任何方法都好,不用去擔心伺服器重啟的問題

  2:安全性

    SQLServer模式比InProc模式和StateServer模式更安全,可以更簡單的通過配置SQLServer的安全選項來保護你的資料

  3:擴充性

    Web伺服器叢集,可以很容易的擷取Session變數,因為它們都儲存在一個獨立的資料庫

  預設情況下是第一種模式,第二種和第三種模式叫“進程外模式”,因為Session變數的儲存和Web網站沒有關係。

  在web.config裡可以通過<sessionState/>節點配置狀態模式

  四:我們下面就來探討第三種這種最好的儲存模式

  1:配置SQL Server來儲存Session狀態

  配置工作需要通過一個叫aspnet_regsql.exe的命令列工具來完成

  格式

  aspnet_regsql.exe -S <SQL Server IP> -U <User Name> -P <Password> -E -ssadd -sstype c -d <Database Name>

  

  實際操作中,開始運行:

  C:\WINDOWS\Microsoft.NET\Framework\版本號碼\aspnet_regsql.exe -S . -U sa -P hy -ssadd -sstype c -d aspstate

 

  

  SQLServer中Session狀態資料庫中產生的表和預存程序

  

 

  2:配置Web.config來儲存Session狀態

  一旦成功配置SQLServer伺服器來支援儲存Session狀態,下一步需要在ASP.NET Web應用程式中的Web.Config檔案修改sessionState配置項以使Session狀態資料庫生效。

 .
 

  <sessionState mode="SQLServer" sqlConnectionString="server=.;database=aspstate;user=sa;pwd=123" allowCustomSqlDatabase="true" cookieless="false" timeout="20"></sessionState>

  五:執行個體

  我們建立兩個Web表單WebForm1.aspx,WebForm2.aspx ,第一個頁面顯示一個“添加商品至我的購物車”按鈕,當單擊的時候把一個固定產品儲存在一個DataTable中,然後通過儲存這個DataTable在一個Session變數中,來把它在請求中傳遞,第二個頁面顯示了來自DataTable中被添加的商品。

  我們可以看到第三張圖輸出的SessionID和SQLServerSession狀態儲存伺服器資料庫裡面的SessionID一致,是通過這個SessionID來維護的每個使用者的資料的,說明什麼呢?說明你的Session變數被真正的儲存在了SQLServer伺服器的資料庫中,並在WebForm2.aspx頁輸出了

   運行效果

  

  

  

  

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.