Provider di cache di output ASP.NET per la Cache Redis di Azure

Il provider di cache Redis di output è un meccanismo di memorizzazione out-of-process per i dati della cache di output. Tali dati sono specificamente utilizzati per le risposte HTTP complete (memorizzazione nella cache di output delle pagine). Il provider viene inserito nel nuovo punto di estendibilità del provider di cache di output che è stato introdotto in ASP.NET 4. Per le applicazioni ASP.NET Core, leggere Memorizzazione delle risposte nella cache in ASP.NET Core.

Per usare il provider di cache Redis di output, configurare prima di tutto la cache, quindi configurare l'applicazione ASP.NET usando il pacchetto NuGet del provider di cache Redis di output. Questo argomento offre indicazioni sulla configurazione dell'applicazione per l'uso del provider di cache di output Redis. Per altre informazioni sulla creazione e sulla configurazione di un'istanza della Cache Redis di Azure, vedere Creare una cache.

Archiviare l'output della pagina ASP.NET nella cache

Per configurare un'applicazione client in Visual Studio con il pacchetto NuGet dello Stato sessione della cache di Azure per Redis, selezionare Gestione pacchetti NuGet, Console di Gestione pacchetti dal menu Strumenti.

Eseguire questo comando nella finestra Package Manager Console.

Install-Package Microsoft.Web.RedisOutputCacheProvider

Il pacchetto NuGet del provider di cache di output Redis ha una dipendenza dal pacchetto StackExchange.Redis. Se il pacchetto StackExchange.Redis non è presente nel progetto, viene installato. Per altre informazioni sul pacchetto NuGet provider di cache Redis di output, vedere la pagina di NuGet su RedisOutputCacheProvider.

Il pacchetto NuGet scarica e aggiunge i riferimenti all'assembly richiesto e aggiunge la sezione seguente al file web.config. Questa sezione contiene la configurazione richiesta dall'applicazione ASP.NET per usare il provider di cache di output Redis.

<caching>
  <outputCache defaultProvider="MyRedisOutputCache">
    <providers>
      <add name="MyRedisOutputCache" type="Microsoft.Web.Redis.RedisOutputCacheProvider"
           host=""
           accessKey=""
           ssl="true" />
    </providers>
  </outputCache>
</caching>

Configurare gli attributi a sinistra con i valori della cache nel portale di Microsoft Azure. Configurare anche gli altri valori desiderati. Per istruzioni sull'accesso alle proprietà della cache, vedere Configurare le impostazioni di Cache Redis di Azure.

Attributo Tipo Default Descrizione
host string "localhost" Indirizzo IP o nome host del server Redis
port numero intero positivo 6379 (non-TLS/SSL)
6380 (TLS/SSL)
Porta del server Redis
accessKey string "" Password del server Redis quando l'autorizzazione Redis è abilitata. Il valore è una stringa vuota per impostazione predefinita, il che significa che il provider della Stato sessione non userà alcuna password quando si connette al server Redis. Se il server Redis si trova in una rete accessibile pubblicamente, ad esempio la cache di Azure per Redis, assicurarsi di abilitare l'autorizzazione Redis per migliorare la sicurezza e fornire una password sicura.
ssl boolean false Indica se connettersi al server Redis tramite TLS. Questo valore è False per impostazione predefinita, poiché Redis non supporta TLS per impostazione predefinita. Se si usa la cache di Azure per Redis, che supporta SSL per impostazione predefinita, assicurarsi di impostare questo valore su True per migliorare la sicurezza.

La porta non TLS è disabilitata per impostazione predefinita per le nuove cache. Per usare la porta TLS, specificare True per questa impostazione. Per ulteriori informazioni sull'abilitazione della porta non TLS, vedere la sezione Porte di accesso nell'articolo Configurare una cache.
databaseIdNumber numero intero positivo 0 Questo attributo può essere specificato solo tramite web.config o AppSettings.

Specificare il database Redis da usare.
connectionTimeoutInMilliseconds numero intero positivo Fornito da StackExchange.Redis Usato per impostare ConnectTimeout durante la creazione di StackExchange.Redis.ConnectionMultiplexer.
operationTimeoutInMilliseconds numero intero positivo Fornito da StackExchange.Redis Usato per impostare SyncTimeout durante la creazione di StackExchange.Redis.ConnectionMultiplexer.
connectionString (stringa di connessione StackExchange.Redis valida) string n/d Riferimento a un parametro a AppSettings o web.config oppure a una stringa di connessione StackExchange.Redis valida. Questo attributo può fornire valori per host, port, accessKey, ssle altri attributi StackExchange.Redis. Per un approfondimento di connectionString, vedere Impostazione di connectionString nella sezione Note sugli attributi.
settingsClassName
settingsMethodName
string
string
n/d Questi attributi possono essere specificati solo tramite web.config o AppSettings.

Usare tali attributi per fornire una stringa di connessione. settingsClassName deve essere un nome qualificato della classe dell'assembly che contiene il metodo specificato da settingsMethodName.

Il metodo specificato da settingsMethodName deve essere pubblico, statico e void (che non accetti alcun parametro), con un tipo restituito di stringa. Questo metodo restituisce la stringa di connessione effettiva.
loggingClassName
loggingMethodName
string
string
n/d Questi attributi possono essere specificati solo tramite web.config o AppSettings.

Usare questi attributi per eseguire il debug dell'applicazione inviando i log dalla cache di Stato sessione/output insieme ai log di StackExchange.Redis. loggingClassName deve essere un nome qualificato della classe dell'assembly che contiene il metodo specificato da loggingMethodName.

Il metodo specificato da loggingMethodName deve essere pubblico, statico e void (che non accetta alcun parametro), con un tipo restituito di System.IO.TextWriter.
applicationName string Nome del modulo del processo corrente o "/" Solo SessionStateProvider
Questo attributo può essere specificato solo tramite web.config o AppSettings.

Prefisso del nome dell'app da usare nella cache Redis. Il cliente può usare la stessa cache Redis per scopi diversi. Per assicurarsi che le chiavi della sessione non siano in conflitto, è possibile anteporre il nome dell'applicazione.
throwOnError boolean true Solo SessionStateProvider
Questo attributo può essere specificato solo tramite web.config o AppSettings.

Indica se generare un'eccezione quando si verifica un errore.

Per altre informazioni su throwOnError, vedere Note suthrowOnError nella sezione Note sull'attributo.
retryTimeoutInMilliseconds numero intero positivo 5000 Solo SessionStateProvider
Questo attributo può essere specificato solo tramite web.config o AppSettings.

Tempo di ripetizione dei tentativi in caso di esito negativo di un'operazione. Se questo valore è minore di operationTimeoutInMilliseconds, il provider non ritenterà.

Per altre informazioni su retryTimeoutInMilliseconds, vedere Note su retryTimeoutInMilliseconds nella sezione Note sull'attributo.
redisSerializerType string n/d Specifica il nome qualificato del tipo di assembly di una classe che implementa Microsoft.Web.Redis. Serializzatore e che contenga la logica personalizzata per serializzare e deserializzare i valori. Per altre informazioni, vedere Informazioni su redisSerializerType nella sezione Note sull'attributo.

Note sull'attributo

Impostazione di connectionString

Il valore di connectionString viene usato come chiave per recuperare la stringa di connessione effettiva da AppSettings, se tale stringa esiste in AppSettings. Se non viene trovata in AppSettings, il valore di connectionString verrà usato come chiave per recuperare la stringa di connessione effettiva dalla sezione ConnectionString di web.config, se tale sezione esiste. Se la stringa di connessione non esiste in AppSettings o nella sezione ConnectionString di web.config, il valore letterale di connectionString verrà usato come stringa di connessione durante la creazione di StackExchange.Redis.ConnectionMultiplexer.

Gli esempi seguenti illustrano come viene usato connectionString.

Esempio 1

<connectionStrings>
    <add name="MyRedisConnectionString" connectionString="mycache.redis.cache.windows.net:6380,password=actual access key,ssl=True,abortConnect=False" />
</connectionStrings>

In web.config, usare la chiave precedente come valore del parametro anziché come valore effettivo.

<sessionState mode="Custom" customProvider="MySessionStateStore">
    <providers>
        <add type = "Microsoft.Web.Redis.RedisSessionStateProvider"
             name = "MySessionStateStore"
             connectionString = "MyRedisConnectionString"/>
    </providers>
</sessionState>

Esempio 2

<appSettings>
    <add key="MyRedisConnectionString" value="mycache.redis.cache.windows.net:6380,password=actual access key,ssl=True,abortConnect=False" />
</appSettings>

In web.config, usare la chiave precedente come valore del parametro anziché come valore effettivo.

<sessionState mode="Custom" customProvider="MySessionStateStore">
    <providers>
        <add type = "Microsoft.Web.Redis.RedisSessionStateProvider"
             name = "MySessionStateStore"
             connectionString = "MyRedisConnectionString"/>
    </providers>
</sessionState>

Esempio 3

<sessionState mode="Custom" customProvider="MySessionStateStore">
    <providers>
        <add type = "Microsoft.Web.Redis.RedisSessionStateProvider"
             name = "MySessionStateStore"
             connectionString = "mycache.redis.cache.windows.net:6380,password=actual access key,ssl=True,abortConnect=False"/>
    </providers>
</sessionState>

Note su throwOnError

Al momento, se si verifica un errore durante un'operazione di sessione, il provider dello Stato della sessione genera un'eccezione. La generazione dell'eccezione arresta l'applicazione.

Questo comportamento è stato modificato in modo da supportare le aspettative degli utenti del provider dello Stato sessione ASP.NET esistenti, consentendo allo stesso tempo di agire sulle eccezioni. Il comportamento predefinito genera comunque un'eccezione quando si verifica un errore, coerente con altri provider dello Stato della sessione ASP.NET. Il codice esistente dovrebbe funzionare come in precedenza.

Se si imposta throwOnError su False, invece di generare un'eccezione quando si verifica un errore, l'operazione ha esito negativo automaticamente. Per controllare se si è verificato un errore e, in tal caso, individuare l'eccezione, controllare la proprietà statica Microsoft.Web.Redis.RedisSessionStateProvider.LastException.

Note su retryTimeoutInMilliseconds

L'impostazione retryTimeoutInMilliseconds fornisce una logica per semplificare il caso in cui un'operazione di sessione debba riprovare in caso di errore a causa di un problema temporaneo rete o di altro tipo. L'impostazione retryTimeoutInMilliseconds consente anche di controllare il timeout di ripetizione dei tentativi o di rifiutare esplicitamente il nuovo tentativo.

Se si imposta retryTimeoutInMilliseconds su un numero, ad esempio 2000, quando un'operazione di sessione non riesce, viene eseguito un nuovo tentativo per 2000 millisecondi prima di considerarlo come errore. Per fare in modo che il provider di stato della sessione applichi questa logica di ripetizione dei tentativi, basta configurare il timeout. Il primo tentativo verrà eseguito dopo 20 millisecondi, che è un temo sufficiente nella maggior parte dei casi quando si verifica un errore di rete. Successivamente, verrà eseguito un nuovo tentativo ogni secondo fino a quando non si verifica il timeout. Subito dopo il timeout, verrà eseguito un nuovo tentativo per assicurarsi che il timeout non venga tagliato di un secondo (al massimo).

Se non si ritiene necessario riprovare o se si vuole gestire manualmente la logica di ripetizione dei tentativi, impostare retryTimeoutInMilliseconds su 0. Ad esempio, potrebbe non essere necessario riprovare quando si esegue il server Redis nello stesso computer dell'applicazione.

Informazioni su redisSerializerType

La serializzazione per archiviare i valori in Redis viene eseguita in un formato binario per impostazione predefinita, fornito dalla classe BinaryFormatter . Usare redisSerializerType per specificare il nome del tipo qualificato dell'assembly di una classe che implementa Microsoft.Web.Redis.ISerializer e dispone della logica personalizzata per serializzare e deserializzare i valori. Ad esempio, ecco una classe del serializzatore JSON che usa JSON.NET:

namespace MyCompany.Redis
{
    public class JsonSerializer : ISerializer
    {
        private static JsonSerializerSettings _settings = new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All };

        public byte[] Serialize(object data)
        {
            return Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(data, _settings));
        }

        public object Deserialize(byte[] data)
        {
            if (data == null)
            {
                return null;
            }
            return JsonConvert.DeserializeObject(Encoding.UTF8.GetString(data), _settings);
        }
    }
}

Supponendo che questa classe sia definita in un assembly con nome MyCompanyDll, è possibile impostare il parametro redisSerializerType per usarla:

<sessionState mode="Custom" customProvider="MySessionStateStore">
    <providers>
        <add type = "Microsoft.Web.Redis.RedisSessionStateProvider"
             name = "MySessionStateStore"
             redisSerializerType = "MyCompany.Redis.JsonSerializer,MyCompanyDll"
             ... />
    </providers>
</sessionState>

Direttiva cache di output

Aggiungere una direttiva OutputCache a ogni pagina per cui si desidera memorizzare l'output nella cache.

<%@ OutputCache Duration="60" VaryByParam="*" %>

Nell'esempio precedente, i dati delle pagine rimangono memorizzati nella cache per 60 secondi e per ogni combinazione di parametri viene memorizzata nella cache una versione diversa della pagina. Per altre informazioni sulla direttiva OutputCache, vedere @outputCache.

Dopo aver eseguito questi passaggi, l'applicazione è configurata per l'uso del provider di cache di output Redis.

Provider di cache di output di terze parti

Passaggi successivi

Vedere Provider di stato sessione ASP.NET per Cache Redis di Azure.