Nello script precedente (https://www.aspitalia.com/script/1446/Sfruttare-Tag-Neloutput-Cache-ASP.NET-Core.aspx) abbiamo introdotto il concetto di tag delle risorse nell'output cache, così da avere la possibilità di rimuoverle in maniera deterministica - per esempio quando i dati nel database sono cambiati:
app.MapGet("/cachedemo", () => { return $"Time is {DateTime.Now.ToLongTimeString()} and this is cached"; }).CacheOutput(policy => { policy.Tag("all"); policy.Tag("cachedemo"); });
Se provassimo a utilizzare questa tecnica in un'applicazione reale, però, ci renderemmo subito conto di un'importante limitazione: i tag inseriti in questo modo sono statici, non possono cioé dipendere dai parametri della richiesta, perché non abbiamo alcun modo per accedervi.
Esistono diverse soluzioni, ma quella più semplice è creare un extension method per OutputCachePolicyBuilder chiamato TagWithContext, che accetti come parametro una Func< HttpContext, string>:
app.MapGet("/cachedemo/{name}", (string name) => { return $"Hello {name}, time is {DateTime.Now.ToLongTimeString()} and this is cached"; }).CacheOutput(policy => { policy.TagWithContext(httpContext => { var name = httpContext.Request.RouteValues["name"] as string; return $"tag-{name}"; }); });
Questo delegate ci permetterà di scrivere la nostra logica che, a partire dall'HttpContext, ritorni il tag desiderato. Nell'esempio in alto, siamo andati a leggere il valore del parametro "name" nel routing, per poi costruire il corrispondente tag.
Internamente, TagWithContext sfrutta il metodo With che solitamente viene usato per specificare condizioni di caching:
public static OutputCachePolicyBuilder TagWithContext(this OutputCachePolicyBuilder builder , Func<HttpContext, string> tagProvider) { builder = builder ?? throw new ArgumentNullException(nameof(builder)); tagProvider = tagProvider ?? throw new ArgumentNullException(nameof(tagProvider)); return builder.With(context => { var tag = tagProvider(context.HttpContext); if (!string.IsNullOrEmpty(tag)) { context.Tags.Add(tag); } return true; }); }
Nel nostro caso invece, noi vogliamo sfruttarlo semplicemente per avere un'istanza valida di HttpContext, che poi passiamo al delegate. Quest'ultimo genererà il tag, come abbiamo visto nello snippet precedente, che potremo poi aggiungere alla lista di tag correnti.
Come ultimo passaggio, restituiamo true, per indicare che vogliamo procedere al caching della risposta.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Autenticazione di git tramite Microsoft Entra ID in Azure DevOps
Introduzione alle Container Queries
.NET Conference Italia 2024
Aggiornare a .NET 9 su Azure App Service
Rendere le variabili read-only in una pipeline di Azure DevOps
Inference di dati strutturati da testo con Semantic Kernel e ASP.NET Core Web API
Ordine e importanza per @layer in CSS
Aprire una finestra di dialogo per selezionare una directory in WPF e .NET 8
Utilizzare il nuovo modello GPT-4o con Azure OpenAI
Gestire il colore CSS con HWB
Gestione file Javascript in Blazor con .NET 9
Triggerare una pipeline su un altro repository di Azure DevOps
I più letti di oggi
- Eseguire una chiamata AJAX per inviare dati al server in Angular 2
- Formati per l'impostazione del colore in CSS3
- la Call For Papert per #netconfit è aperta!invia la tua sessione da https://aspit.co/netconfit-20 puoi parlare di #net5, #aspnet5, #efcore5, #CSharp9 e tutto quello che ruota intorno a #dotnet.
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Impostare un riferimento ad una entity collegata tramite foreign key