工作階段狀態模式

更新:2007 年 11 月

ASP.NET 工作階段狀態支援數種不同的工作階段資料儲存選項。每個選項是由 SessionStateMode 列舉型別中的值識別。下列清單描述可用的工作階段狀態模式:

  • InProc 模式,此模式會將工作階段狀態存放在 Web 伺服器的記憶體中。此為預設設定。

  • StateServer 模式,此模式會將工作階段狀態儲存在稱為 ASP.NET 狀態服務的個別處理序中。這樣可以確保工作階段狀態在 Web 應用程式重新啟動時保留下來,並且讓 Web 伺服陣列中的多個 Web 伺服器都能夠使用工作階段狀態。

  • SQLServer 模式,此模式會將工作階段狀態儲存在 SQL Server 資料庫中。這樣可以確保工作階段狀態在 Web 應用程式重新啟動時保留下來,並且讓 Web 伺服陣列中的多個 Web 伺服器都能夠使用工作階段狀態。

  • Custom 模式,此模式可讓您指定自訂儲存提供者 (Provider)。

  • Off 模式,此模式會停用工作階段狀態。

您可以在應用程式的 Web.config 檔中,將 SessionStateMode 列舉值指派給 sessionState 項目的 mode 屬性 (Attribute),以便指定要 ASP.NET 工作階段狀態使用的模式。除了 InProcOff 以外的模式都需有其他參數 (例如連接字串值),本主題稍後將會說明。您可以存取 HttpSessionState.Mode 屬性值,以檢視目前選取的工作階段狀態。

同處理序模式

同處理序模式是預設工作階段狀態模式,且是使用 InProcSessionStateMode 列舉值所指定。同處理序模式會將工作階段狀態值和變數存放在本機 Web 伺服器的記憶體中。這是唯一支援 Session_OnEnd 事件的模式。如需 Session_OnEnd 事件的詳細資訊,請參閱工作階段狀態事件

警告:

如果您在應用程式的 Web.config 檔中,將 processModel 項目的 webGarden 屬性設為 true,以便啟用 Web 處理序區模式,請勿使用 InProc 工作階段狀態模式。如果這麼做,由不同的背景工作處理序處理相同工作階段的不同要求時,就會發生資料遺失的情形。

狀態伺服器模式

StateServer 模式會將工作階段狀態存放在處理序中 (稱為 ASP.NET 狀態服務),這個處理序則與 ASP.NET 背景工作處理序或 IIS 應用程式集區有所不同。使用此模式可以確保工作階段狀態在 Web 應用程式重新啟動時會保存下來,並且讓 Web 伺服陣列中的多個 Web 伺服器都能夠使用工作階段狀態。

若要使用 StateServer 模式,您必須先確定 ASP.NET 狀態服務正在做為工作階段存放區的伺服器上執行。已安裝 ASP.NET 和 .NET Framework 時,ASP.NET 狀態服務會安裝為服務。ASP.NET 狀態服務會安裝在下列位置:

systemroot\Microsoft.NET\Framework\versionNumber\aspnet_state.exe

若要將 ASP.NET 應用程式設定為使用 StateServer 模式,請在應用程式的 Web.config 檔中執行下列動作:

下列範例會顯示 StateServer 模式的組態設定,其中工作階段狀態會存放在名為 SampleStateServer 的遠端電腦上。

<configuration>
  <system.web>
    <sessionState mode="StateServer"
      stateConnectionString="tcpip=SampleStateServer:42424"
      cookieless="false"
      timeout="20"/>
  </system.web>
</configuration>
注意事項:

如果模式設為 StateServer,則存放在工作階段狀態中的物件必須是可序列化的。如需可序列化物件的詳細資訊,請參閱 SerializableAttribute 類別。

若要在 Web 伺服陣列中使用 StateServer 模式,在屬於 Web 伺服陣列的所有應用程式中,您必須具有與 Web 組態之 machineKey 項目所指定的相同加密金鑰。如需如何建立電腦金鑰的詳細資訊,請參閱 Microsoft 知識庫文件 313091<如何利用 Visual Basic . NET 以用於表單驗證建立金鑰>,網址為 https://support.microsoft.com。

SQL Server 模式

SQLServer 模式,此模式會將工作階段狀態儲存在 SQL Server 資料庫中。使用此模式可以確保工作階段狀態在 Web 應用程式重新啟動時會保存下來,並且讓 Web 伺服陣列中的多個 Web 伺服器都能夠使用工作階段狀態。

注意事項:

如果模式是「SQL Server」,儲存在工作階段狀態中的物件必須可序列化。如需可序列化物件的詳細資訊,請參閱 SerializableAttribute 類別。

若要使用 SQLServer 模式,您必須先確定已在 SQL Server 上安裝 ASP.NET 工作階段狀態資料庫。您可以使用 Aspnet_regsql.exe 工具安裝 ASP.NET 工作階段狀態資料庫,本主題稍後將會說明。

若要將 ASP.NET 應用程式設定為使用 SQLServer 模式,請在應用程式的 Web.config 檔中執行下列動作:

下列範例會顯示 SQLServer 模式的組態設定,其中工作階段狀態會存放在名為 "SampleSqlServer" 的 SQL Server 上。

<configuration>
  <system.web>
    <sessionState mode="SQLServer"
      sqlConnectionString="Integrated Security=SSPI;data 
        source=SampleSqlServer;" />
  </system.web>
</configuration>
注意事項:

如果您使用 sessionState 項目的 sqlConnectionString 屬性,在組態檔中將信任的連接指派至 SQL Server,則 SessionStateModule 將使用 SQL Server 整合式安全以連接至 SQL Server。若有 ASP.NET 處理序識別 (Identity) 或者對 identity 組態項目提供的使用者認證,將使用它們進行連接。您可以改而指定 <identity impersonate="true" />,並且將 sessionState 組態項目的 useHostingIdentity 屬性設為 false,以便指定使用 IIS 模擬的識別。如需 ASP.NET 處理序識別的詳細資訊,請參閱設定 ASP.NET 處理序識別ASP.NET 模擬

若要設定 Web 伺服陣列的 SQLServer 模式,請在每個 Web 伺服器的組態檔中,將 sessionState 項目的 sqlConnectionString 屬性設為指向相同的 SQL Server 資料庫。在 SQL Server 資料庫中共用工作階段狀態的所有 Web 伺服器上,IIS Metabase 中的 ASP.NET 應用程式路徑都必須相同。如需當伺服器之間的應用程式路徑不同時解決此問題的步驟詳細資訊,請參閱 Microsoft 知識庫文件 325056<PRB:如果您使用 SqlServer 或 StateServer 工作階段模式,Web 伺服陣列中的工作階段狀態會遺失>,網址為 https://support.microsoft.com。

使用 Aspnet_regsql.exe 工具安裝工作階段狀態資料庫

若要在 SQL Server 上安裝工作階段狀態資料庫,請在 Web 伺服器上執行 Aspnet_regsql.exe 工具 (位於 systemroot\Microsoft.NET\Framework\versionNumber 資料夾)。使用命令提供下列資訊:

  • 使用 -S 選項提供 SQL Server 執行個體的名稱。

  • 帳戶的登入認證,該帳戶具有在 SQL Server 上建立資料庫的使用權限。以 -E 選項使用目前登入的使用者,或使用 -U 選項指定使用者 ID 並搭配 -P 選項指定密碼。

  • 用於加入工作階段狀態資料庫的 -ssadd 命令列選項。

    根據預設,您無法使用 Aspnet_regsql.exe 工具在 SQL Server Express Edition 上安裝工作階段狀態資料庫。若要執行 Aspnet_regsql.exe 工具以安裝 SQL Server Express Edition 資料庫,您必須先使用如下所示的 T-SQL 命令,啟用 Agent XPs SQL Server 選項:

    EXECUTE sp_configure 'show advanced options', 1
    RECONFIGURE WITH OVERRIDE
    GO
    
    EXECUTE sp_configure 'Agent XPs', 1
    RECONFIGURE WITH OVERRIDE
    GO
    
    EXECUTE sp_configure 'show advanced options', 0
    RECONFIGURE WITH OVERRIDE
    GO
    

    您必須對已停用 Agent XPs 選項的任何 SQL Server Express Edition 執行個體執行這些 T-SQL 命令。

根據預設,Aspnet_regsql.exe 工具將建立名為 ASPState 的資料庫,其中包含支援 SQLServer 模式的預存程序 (Stored Procedure)。工作階段資料本身會預設為存放在 tempdb 資料庫中。您可以選擇性地使用 -sstype 選項,變更工作階段資料的儲存位置。下表會指定 -sstype 選項的可能值:

選項

說明

t

將工作階段資料儲存在 SQL Server tempdb 資料庫中。此為預設設定。如果您將工作階段資料儲存在 tempdb 資料庫中,則重新啟動 SQL Server 就會遺失工作階段資料。

p

將工作階段資料存放在 ASPState 資料庫中,而不是 tempdb 資料庫。

c

將工作階段資料儲存在自訂資料庫中。如果您指定 c 選項,同時必須使用 -d 選項包含自訂資料庫的名稱。

例如,下列命令會在名為 "SampleSqlServer" 的 SQL Server 執行個體上建立名為 ASPState 的資料庫,並指定工作階段資料也存放於 ASPState 資料庫中:

aspnet_regsql.exe -S SampleSqlServer -E -ssadd -sstype p

注意事項:

如果您是執行 ASP.NET 1.0 或 ASP.NET 1.1,則無法使用 Aspnet_regsql.exe 工具設定 ASP.NET,進而在持續性 SQL Server 資料庫中存放工作階段狀態。不過,您可以取得指令碼以在持續性 (Persistent) 資料庫中存放工作階段狀態。如需詳細資訊,請參閱 Microsoft 知識庫 (網址為 https://support.microsoft.com) 中的文件 311209<HOW TO:設定 ASP.NET 以進行永續 SQL Server 工作階段狀態管理>。另一個可行辦法是,執行 ASP.NET 1.0 或 ASP.NET 1.1 的 Web 伺服器可以將持續性工作階段狀態指向已安裝 ASP.NET 2.0 工作階段狀態結構描述的 SQL Server。

SQLServer 模式中,您可以將數台執行 SQL Server 的電腦設定為當做容錯移轉叢集運作,容錯移轉叢集是兩台以上執行 SQL Server 的相同電腦會存放單一資料庫的資料。如果其中一台執行 SQL Server 的電腦發生錯誤,叢集中的其他伺服器便可接管並處理要求,而不會遺失工作階段資料。若要設定容錯移轉叢集的 SQL Server 模式,在您執行 Aspnet_regsql.exe 工具時必須指定 -sstype p,這樣工作階段狀態資料才會存放在 ASPState 資料庫中而不是 tempdb 資料庫。SQL Server 叢集不支援將工作階段狀態儲存在 tempdb 資料庫。如需設定容錯移轉叢集之 SQL Server 模式的詳細資訊,請參閱 Microsoft 知識庫文件 323262<如何使用 ASP . NET SQL Server 模式工作階段狀態在容錯移轉叢集>,網址為 https://support.microsoft.com。

自訂模式

Custom 模式會指定您要使用自訂工作階段狀態存放區提供者,存放工作階段狀態資料。當您以 CustomMode 設定 ASP.NET 應用程式時,必須使用 sessionState 組態項目的 providers 子項目,指定工作階段狀態存放區提供者的類型。您可以使用 add 子項目指定提供者類型,同時包含會指定提供者類型名稱的 type 屬性,以及會指定提供者執行個體名稱的 name 屬性。然後提供者執行個體的名稱會提供給 sessionState 項目的 customProvider 屬性,以便將 ASP.NET 工作階段狀態設定為使用該提供者執行個體進行存放和擷取工作階段資料。

下列範例顯示 Web.config 檔中的項目,這些項目會指定 ASP.NET 工作階段狀態使用自訂工作階段狀態存放區提供者。

<configuration>
  <connectionStrings>
    <add name="OdbcSessionServices" 
      connectionString="DSN=SessionState;" />
  </connectionStrings>

  <system.web>
    <sessionState 
      mode="Custom"
      customProvider="OdbcSessionProvider">
      <providers>
        <add name="OdbcSessionProvider"
          type="Samples.AspNet.Session.OdbcSessionStateStore"
          connectionStringName="OdbcSessionServices" 
          writeExceptionsToEventLog="false" />
      </providers>
    </sessionState>
  </system.web>
</configuration>

如需自訂工作階段狀態存放區提供者的詳細資訊,請參閱 實作工作階段狀態存放區提供者

注意事項:

自訂工作階段狀態存放區提供者會使用 ASP.NET 處理序識別或是提供給 identity 組態項目的使用者認證 (如果存在的話) 存取安全的資源,例如 SQL Server。您可以改而指定 <identity impersonate="true" />,並且將 sessionState 組態項目的 useHostingIdentity 屬性設為 false,以便指定使用 IIS 模擬的識別。如需 ASP.NET 處理序識別的詳細資訊,請參閱設定 ASP.NET 處理序識別ASP.NET 模擬

請參閱

概念

ASP.NET 工作階段狀態概觀

ASP.NET 狀態管理概觀

參考

sessionState 的 providers 項目 (ASP.NET 設定結構描述)