Immaginiamo di trovarci in uno scenario in cui abbiamo un'applicazione (può trattarsi di un sito web, o un App su device) che consuma servizi esposti tramite Web API. Nel caso in cui la risposta di uno dei servizi invocati sia scarsamente variabile, ma le richieste siano ripetute nel tempo - per esempio il contenuto di un menu - il caching client side è uno dei metodi più efficaci per raggiungere immediatamente due importanti risultati:
- Migliorare le prestazioni generali del sistema, soprattutto in termini di latenza vista dall'utente: in questo modo, infatti, il client mantiene il dato in una cache locale, e la riutilizza nelle chiamate successive, evitando di dover connettersi al servizio;
- migliorare la scalabilità server side, perchè il numero di richieste che il nostro servizio si troverà a dover gestire sarà inferiore.
Al fine di attivare questa funzionalità, è sufficiente impostare l'attributo ResponseCache, a livello di singola action o di controller:
[HttpGet, ResponseCache(Location = ResponseCacheLocation.Any, Duration = 300)] public IEnumerable<string> Get() { return new string[] { "value1", "value2", "value3" }; }
Nel nostro caso, ad esempio, stiamo specificando che la risposta può essere mantenuta in cache per un TTL di 300 secondi. Si tratta di un caso molto semplice, perchè applicato a un metodo che non accetta parametri. Volendo, possiamo sfruttare anche le proprietà VaryByHeader o VaryByQueryKeys per indicare quali chiavi dell'header o della querystring devono essere considerate come invarianti per la cache.
Il risultato di questo attribute è l'aggiunta di un header cache-control alla risposta, che indica al browser (o al generico client HTTP) che è effettivamente possibile mantenere una cache locale della stessa:
HTTP/1.1 200 OK Cache-Control: public,max-age=300 Transfer-Encoding: chunked Content-Type: application/json; charset=utf-8 Server: Kestrel X-Powered-By: ASP.NET Date: Sun, 11 Mar 2018 16:22:17 GMT 1c ["value1","value2","value3"] 0
L'esempio mostrato ci consente di migliorare facilmente le prestazioni generali del sistema. Un problema, però, è che non possiamo aumentare in maniera indefinita il TTL: quando un elemento è in cache sul client, infatti, è al di fuori del nostro controllo e non possiamo, per esempio, invalidarlo se i dati cambiano. Questo purtroppo è un vincolo dal quale non possiamo sfuggire facilmente, che fa sì che ogni 5 minuti - secondo il codice che abbiamo scritto sopra - ogni client sia comunque costretto a effettuare un nuovo download del contenuto. Nel prossiom script vedremo come mitigare questo problema.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Il nuovo controllo Range di Blazor 9
Generare HTML a runtime a partire da un componente Razor in ASP.NET Core
Path addizionali per gli asset in ASP.NET Core MVC
Esporre i propri servizi applicativi con Semantic Kernel e ASP.NET Web API
Usare i settings di serializzazione/deserializzazione di System.Text.Json di ASP.NET all'interno di un'applicazione non web
La gestione della riconnessione al server di Blazor in .NET 9
Filtering sulle colonne in una QuickGrid di Blazor
Utilizzare il metodo Index di LINQ per scorrere una lista sapendo anche l'indice dell'elemento
Rendere i propri workflow e le GitHub Action utilizzate più sicure
Generare una User Delegation SAS in .NET per Azure Blob Storage
Utilizzare gRPC su App Service di Azure
I più letti di oggi
- Eseguire query in contemporanea con EF
- Fissare una versione dell'agent nelle pipeline di Azure DevOps
- .NET Aspire per applicazioni distribuite
- Utilizzare Locust con Azure Load Testing
- Autenticazione di git tramite Microsoft Entra ID in Azure DevOps
- Repaint, Reflow e Compositing: Come Funziona il Rendering nel Browser
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!