適用於 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 建置實際的雲端應用程式)(英文)。