天天看點

一起談.NET技術,負載均衡伺服器Session共享的解決方案

  在ASP.NET的程式中要使用Session對象時,必須確定頁面的@page指令中EnableSessionState屬性是True或者 Readonly,并且在web.config檔案中正确的設定了SessionState屬性。

  ASP.NET中Session的狀态保持是由web.config檔案中的标記下的标記的mode屬性來決定的。該屬性有四種可能的值:Off、Inproc、StateServer和SQlServer。

  設為Off會禁用Session。

  Inproc是預設的設定,這種模式和以前的ASP的會話狀态的方法是類似的,會話的狀态會被儲存在ASP.NET程序中,它的優點是顯而易見的:性能。程序内的資料通路自然會比誇程序的通路快。然而,這種方法Session的狀态依賴于ASP.NET程序,當IIS程序崩潰或者正常重起啟時,儲存在程序中的狀态将丢失。

  為了克服Inproc模式的缺點,ASP.NET提供了兩種程序外保持會話狀态的方法。

  ASP.NET首先提供了提供了一個Windows服務:ASPState,這個服務啟動後,ASP.NET應用程式可以将mode屬性設定為 “SateServer”,來使用這個Windows服務提供的狀态管理方法。

  除了在web.config檔案中設定mode屬性為StateServer外,還必須設定運作StateServer伺服器的IP位址和端口号。

  1、如果在IIS所在的機器運作StateServer則IP位址就是127.0.0.1,端口号通常是42424.配置如下:

  mode=”StateServer”

  stateConnectionString="tcpip=127.0.0.1:42424"

  2、找一台伺服器作為Session伺服器(如IP為:192.168.1.244),啟動其Windows中的ASP.NET State Service(預設的端口号為42424),把啟動類型改為自動;

  3、修改Session伺服器系統資料庫中的項 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services \aspnet_state\Parameters中的AllowRemoteConnection 鍵的值為1,其中的Port鍵控制ASP.NET State Service的監聽端口;修改後需要重新開機ASP.NET State Service才生效;

  4、每台伺服器的web.config 的stateConnectionString都指向這台伺服器。

  使用這種模式,會話狀态的存儲将不依賴IIS程序的失敗或者重新開機,會話的狀态将存儲在StateServer程序的記憶體空間中。

  另一種會話狀态模式是SQLServer模式。這種模式是将會話的狀态儲存在SQL Server資料庫中的。使用這種模式前,必須至少有一台SQL Server伺服器,并在伺服器中建立需要的表和存儲過程。.NET SDK提供了兩個腳本來簡化這個工作:InstallSqlState.sql和UnInstallSqlState.sql。這兩個檔案存放在下面路徑中:

  system drive\WINNT\Microsoft.NET\Framework\version\

  要配置SQL Server 伺服器,可以在指令行中運作SQL Server提供的指令行工具osql.exe

  osql -s [server name] -u [user] -p [password]

  例如:

  osql -s (local) -u as -p “”-i InstallSqlState.sql

  做好必要的資料庫準備工作後,将web.config檔案中的sessionstate元素的mode屬性改為”sqlserver”,并指定 SQL連接配接字元串。具體如下:

  mode="SQLServer"

  sqlConnectionString="data source=127.0.0.1;userid=sa;password=;Trusted_Connection=yes"

  使用SQLServer模式處了可以使Session的狀态不依賴于IIS伺服器之外,還可以利用SQL Server的叢集,使狀态存儲不依賴于單個的SQL Server,這樣就可以為應用程式提供極大的可靠性。