適用於 Azure Cache for Redis 的 ASP.NET 工作階段狀態提供者

Azure Cache for Redis 提供工作階段狀態提供者,可讓您用來將記憶體內部工作階段狀態儲存在 Azure Cache for Redis 中,而不是 SQL Server 資料庫中。 若要使用快取工作階段狀態提供者,請先設定快取,再使用「Azure Cache for Redis 工作階段狀態 NuGet 套件」設定 ASP.NET 應用程式的快取。 如需 ASP.NET Core應用程式,請參閱ASP.NET Core 中的會話和狀態管理

在雲端應用程式中通常並不實用,以避免儲存使用者會話的某種狀態,但某些方法會影響效能和延展性比其他方法多。 如果您需要儲存狀態,最好的方法是將狀態的數量控制得較低,並將其儲存在 Cookie 中。 如果此方法不可行,次佳的方法是使用 ASP.NET 工作階段狀態搭配提供者,進行分散式的記憶體中快取。 從效能和延展性的觀點來看,最差的解決方案是使用資料庫支援的會話狀態提供者。 本文提供使用 ASP.NET 會話狀態提供者 for Azure Cache for Redis 的指引。 如需其他工作階段狀態選項的相關資訊,請參閱 ASP.NET 工作階段狀態選項

將 ASP.NET 工作階段狀態儲存在快取中

若要使用 Azure Cache for Redis 會話狀態NuGet套件在 Visual Studio 中設定用戶端應用程式,請從 [工具] 功能表選取[NuGet 封裝管理員],封裝管理員 [主控台]。

Package Manager Console 視窗執行下列命令。

Install-Package Microsoft.Web.RedisSessionStateProvider

重要

如果您使用進階層的叢集功能,則必須使用 RedisSessionStateProvider 2.0.1 或更高版本,否則會擲回例外狀況。 移至 2.0.1 或更高版本是重大變更。

Redis 會話狀態提供者NuGet套件相依于 StackExchange.Redis 套件。 如果您的專案中沒有 StackExchange.Redis 套件,則會安裝它。

NuGet 封裝會下載和加入必要的組件參考,並將下列區段加入您的 web.config 檔案。 此區段包含讓您的 ASP.NET 應用程式使用 Azure Cache for Redis 工作階段狀態提供者所需的設定。

<sessionState mode="Custom" customProvider="MySessionStateStore">
  <providers>
    <!-- Either use 'connectionString' OR 'settingsClassName' and 'settingsMethodName' OR use 'host','port','accessKey','ssl','connectionTimeoutInMilliseconds' and 'operationTimeoutInMilliseconds'. -->
    <!-- 'throwOnError','retryTimeoutInMilliseconds','databaseId' and 'applicationName' can be used with both options. -->
    <!--
      <add name="MySessionStateStore" 
        host = "127.0.0.1" [String]
        port = "" [number]
        accessKey = "" [String]
        ssl = "false" [true|false]
        throwOnError = "true" [true|false]
        retryTimeoutInMilliseconds = "5000" [number]
        databaseId = "0" [number]
        applicationName = "" [String]
        connectionTimeoutInMilliseconds = "5000" [number]
        operationTimeoutInMilliseconds = "1000" [number]
        connectionString = "<Valid StackExchange.Redis connection string>" [String]
        settingsClassName = "<Assembly qualified class name that contains settings method specified below. Which basically return 'connectionString' value>" [String]
        settingsMethodName = "<Settings method should be defined in settingsClass. It should be public, static, does not take any parameters and should have a return type of 'String', which is basically 'connectionString' value.>" [String]
        loggingClassName = "<Assembly qualified class name that contains logging method specified below>" [String]
        loggingMethodName = "<Logging method should be defined in loggingClass. It should be public, static, does not take any parameters and should have a return type of System.IO.TextWriter.>" [String]
        redisSerializerType = "<Assembly qualified class name that implements Microsoft.Web.Redis.ISerializer>" [String]
      />
    -->
    <add name="MySessionStateStore" type="Microsoft.Web.Redis.RedisSessionStateProvider"
         host=""
         accessKey=""
         ssl="true" />
  </providers>
</sessionState>

標示註解的區段可提供屬性的範例和每個屬性的範例設定。

在Microsoft Azure入口網站中,使用您快取左側的值來設定屬性,並視需要設定其他值。 如需關於存取快取屬性的指示,請參閱設定 Azure Cache for Redis 設定

  • 主機 – 指定您的快取端點。
  • port – 視 TLS 設定而定,請使用非 TLS/SSL 埠或 TLS/SSL 埠。
  • accessKey – 用於快取的主要或次要金鑰。
  • ssl – 如果您想要使用 TLS 保護快取/用戶端通訊,則為 true;否則為 false。 請務必指定正確的連接埠。
    • 新快取預設會停用非 TLS 埠。 針對此設定指定 true,以使用 TLS 埠。 For more information about enabling the non-TLS port, see the Access Ports section in the Configure a cache article.
  • throwOnError – 如果您想要在發生失敗時擲回例外狀況,則為 true;如果您想要讓作業以無訊息方式失敗,則為 false。 您可以核取靜態 Microsoft.Web.Redis.RedisSessionStateProvider.LastException 屬性以檢查失敗。 預設值是 true。
  • retryTimeoutInMilliseconds – 會在此間隔期間 (以毫秒指定) 重試失敗的作業。 第一次重試會在 20 毫秒之後發生,然後每秒重試一次,直到 retryTimeoutInMillisecond 間隔到期為止。 緊接著此間隔之後,作業會進行最後一次重試。 如果作業仍失敗,會視 throwOnError 設定將例外狀況擲回給呼叫者。 預設值為 0,表示不會重試。
  • databaseId – 指定快取輸出資料所使用的資料庫。 若未指定,就會使用預設值 0。
  • applicationName – 金鑰在 redis 中會儲存為 {<Application Name>_<Session ID>}_Data。 這個命名配置可讓多個應用程式共用同一個 Redis 執行個體。 此參數是選擇性的,如果您未提供此參數,則會使用預設值。
  • connectionTimeoutInMilliseconds – 此設定可讓您覆寫 connectTimeout StackExchange.Redis 用戶端中的設定。 若未指定,將會使用預設的 connectTimeout 設定為 5000。 如需詳細資訊,請參閱 StackExchange.Redis 設定模型(英文)。
  • operationTimeoutInMilliseconds – 此設定可讓您覆寫 StackExchange.Redis 用戶端中的 syncTimeout 設定。 如果未指定,則會使用預設 syncTimeout 設定 1000。 如需詳細資訊,請參閱 StackExchange.Redis 設定模型(英文)。
  • redisSerializerType - 此設定可讓您為傳送到 Redis 的工作階段內容指定自訂序列化。 指定的類型必須實作 Microsoft.Web.Redis.ISerializer 且必須宣告公用無參數建構函式。 預設 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter 會使用 。

如需這些屬性的相關詳細資訊,請參閱 發佈 Redis 的 ASP.NET 工作階段狀態提供者(英文) 上的原始部落格文章公告。

別忘記備註您 web.config 中標準 InProc 工作階段狀態提供者區段。

<!-- <sessionState mode="InProc"
     customProvider="DefaultSessionProvider">
     <providers>
        <add name="DefaultSessionProvider"
              type="System.Web.Providers.DefaultSessionStateProvider,
                    System.Web.Providers, Version=1.0.0.0, Culture=neutral,
                    PublicKeyToken=31bf3856ad364e35"
              connectionStringName="DefaultConnection" />
      </providers>
</sessionState> -->

執行了這些步驟後,您的應用程式就會設定為使用 Azure Cache for Redis 工作階段狀態提供者。 當您在應用程式中使用會話狀態時,它會儲存在Azure Cache for Redis實例中。

重要

儲存在快取中的資料必須可序列化,這一點與可以儲存在預設記憶體中 ASP.NET 工作階段狀態供應器的資料不同。 使用 Redis 的工作階段狀態提供者時,請確定儲存在工作階段狀態中的資料類型為可序列化。

ASP.NET 工作階段狀態選項

  • 記憶體中工作階段狀態提供者 – 此提供者會將工作階段狀態儲存在記憶體中。 使用此提供者的優點是簡單且快速。 不過,如果您在記憶體提供者中使用,則無法調整Web Apps,因為它不會散發。
  • SQL Server 工作階段狀態提供者 – 此提供者會將工作階段狀態儲存在 SQL Server 中。 如果您想要在永續性儲存體中儲存工作階段狀態,請使用此供應器。 您可以調整 Web 應用程式,但針對會話使用 Sql Server 對 Web 應用程式有效能影響。 您也可以使用此提供者搭配記憶體內部 OLTP 組態,協助改善效能。
  • 分散式記憶體中工作階段狀態提供者,例如 Azure Cache for Redis 工作階段狀態提供者 – 此提供者可讓您同時兼顧兩方面。 您的 Web 應用程式可擁有簡單、快速而可調整的工作階段狀態供應器。 因為此供應器會將工作階段狀態儲存在快取中,您的應用程式必須考量與分散式記憶體中快取 (例如暫時性網路失敗) 通訊時的所有相關特性。 如需使用快取的最佳做法,請參閱 Microsoft Patterns & Practices Azure 雲端應用程式設計和實作指引中的取指引。

如需工作階段狀態和其他最佳作法的相關詳細資訊,請參閱 Web 開發最佳作法 (使用 Azure 建置實際的雲端應用程式)(英文)。

協力廠商會話狀態提供者

後續步驟

查看 Azure Cache for Redis 的 ASP.NET 輸出快取提供者