Nello script precedente (https://www.aspitalia.com/script/1440/Migliorare-Scalabilita-ASP.NET-Core-Output-Cache.aspx) abbiamo introdotto l'Output Cache, una nuova funzionalità di ASP.NET Core 7 grazie alla quale possiamo migliorare la scalabilità delle nostre applicazioni, effettuando il cache della risposta di un endpoint in modo da non doverlo eseguire in una richiesta successiva.
Un aspetto fondamentale è ovviamente la gestione di eventuali parametri in query string. Per default, l'Output Cache middleware internamente assegna una chiave di cache basata sull'intero URL - query string compresa. Questo fa sì che tutti i parametri presenti, a prescindere dall'ordine, vengono presi in considerazione per determinare se la risposta sia in cache o meno.
Per dimostrarlo, proviamo a modificare l'endpoint che abbiamo costruito in precedenza aggiungendo un parametro Name:
app.MapGet("/cachedemo", (string name) => $"Hello, {name}, time is {DateTime.Now.ToLongTimeString()}") .CacheOutput();
Come possiamo notare eseguendo il codice, variando il valore di Name otterremo sempre risultati freschi, mentre riutilizzando lo stesso valore più di una volta ci farà ritornare la risposta in cache.
Tuttavia, se provassimo ad aggiungere un parametro qualsiasi all'URL, per esempio "anotherParameter", staremmo a tutti gli effetti creando una nuova configurazione di parametri, anche se "anotherParameter" non è utilizzato dal nostro endpoint:
https://localhost:7088/cachedemo?name=Marco&anotherParameter=anotherValue
Il risultato, quindi, sarà un cache miss, con la risposta che sarà elaborata da ASP.NET senza sfruttare la cache - quantomeno alla prima richiesta.
Alle volte, però, vogliamo evitare questa situazione, e controllare esattamente quali parametri in query string devono essere presi in considerazione ai fini del caching, e per farlo possiamo utilizzare un overload di CacheOutput, come nell'esempio in basso:
app.MapGet("/cachedemo", (string name) => $"Hello, {name}, time is {DateTime.Now.ToLongTimeString()}") .CacheOutput(builder => { builder.SetVaryByQuery("name"); });
In questa versione, abbiamo sfruttato l'OutputCachePolicyBuilder per specificare di usare il solo parametro name in query string nella chiave di cache tramiite il metodo SetVaryByQuery, che accetta un array di string dei nomi di quelli da prendere in considerazione.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Evitare il flickering dei componenti nel prerender di Blazor 8
Creazione di plugin per Tailwind CSS: espandere le funzionalità del framework dinamicamente
Effettuare il binding di date in Blazor
Usare un KeyedService di default in ASP.NET Core 8
Utilizzare EF.Constant per evitare la parametrizzazione di query SQL
Utilizzare la versione generica di EntityTypeConfiguration in Entity Framework Core
Sfruttare lo stream rendering per le pagine statiche di Blazor 8
Generare HTML a runtime a partire da un componente Razor in ASP.NET Core
Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary
Testare l'invio dei messaggi con Event Hubs Data Explorer
Eseguire script pre e post esecuzione di un workflow di GitHub
Routing statico e PreRendering in una Blazor Web App