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 會話狀態與分散式記憶體內部快取的提供者。 效能和延展性觀點最差的解決方案是使用資料庫支援的會話狀態提供者。 本文提供使用適用於 Azure Cache for Redis ASP.NET 工作階段狀態提供者的指引。 如需其他會話狀態選項的資訊,請參閱 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 設定

  • host – 指定您的快取端點。
  • 埠 – 視 TLS 設定而定,請使用您的非 TLS/SSL 連接埠或 TLS/SSL 埠。
  • accessKey – 針對快取使用主要或次要密鑰。
  • ssl – 如果您想要使用 TLS 保護快取/客戶端通訊,則為 true;否則為 false。 請務必指定正確的埠。
    • 新的快取預設會停用非 TLS 埠。 針對此設定指定 true 以使用 TLS 埠。 如需啟用非 TLS 埠的詳細資訊,請參閱設定快取一文中的存取埠一節。
  • throwOnError – 如果您想要在發生失敗時擲回例外狀況,則為 true;如果您想要讓作業以無訊息模式失敗,則為 false。 您可以藉由檢查靜態 Microsoft.Web.Redis.RedisSessionStateProvider.LastException 屬性來檢查失敗。 預設值為 True。
  • retryTimeoutInMilliseconds – 在此間隔期間重試失敗的作業,以毫秒為單位指定。 第一次重試會在 20 毫秒之後發生,然後重試每隔一秒,直到 retryTimeoutInMilliseconds 間隔到期為止。 在此間隔之後,作業會重試最後一次。 如果作業仍然失敗,則視 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預設會使用 。

如需這些屬性的詳細資訊,請參閱宣佈 ASP.NET Session State Provider for Redis 時發佈原始的部落格文章

別忘了在 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 會話狀態提供者中的數據。 使用「工作階段狀態提供者 for Redis」時,請確定儲存在工作階段狀態中的數據類型可串行化。

ASP.NET 工作階段狀態選項

  • 在記憶體工作階段狀態提供者中 - 此提供者會將會話狀態儲存在記憶體中。 使用此提供者的優點是簡單且速度。 不過,如果您在記憶體提供者中使用,就無法調整 Web Apps,因為它並未散發。
  • Sql Server 工作階段狀態提供者 - 此提供者會將會話狀態儲存在 Sql Server 中。 如果您想要將會話狀態儲存在持續性記憶體中,請使用此提供者。 您可以調整 Web 應用程式,但使用 Sql Server for Session 對 Web 應用程式有效能影響。 您也可以將此提供者與記憶體內部 OLTP 設定搭配使用,以協助改善效能。
  • 分散式記憶體會話狀態提供者,例如 Azure Cache for Redis 工作階段狀態提供者 - 此提供者提供您兩個世界的最佳功能。 您的 Web 應用程式可以有簡單、快速且可調整的工作階段狀態提供者。 由於此提供者會將會話狀態儲存在快取中,因此您的應用程式必須考慮與分散式記憶體快取交談時相關聯的所有特性,例如暫時性網路失敗。 如需使用快取的最佳做法,請參閱 Microsoft 模式和作法 Azure 雲端應用程式設計和實作指引中的快取指引。

如需會話狀態和其他最佳做法的詳細資訊,請參閱 Web 開發最佳做法(使用 Azure 建置真實世界雲端應用程式)。

第三方會話狀態提供者

下一步

請參閱 適用於 Azure Cache for Redis 的 ASP.NET 輸出快取提供者。