In caso di esigenze particolari, in cui vogliamo configurare l'output cache di ASP.NET Core in base a nostre logiche personalizzate, una buona soluzione è quella di incapsulare tutte queste logiche all'interno di una classe, creando una Custom Policy.
Si tratta di una classe che implementa l'interfaccia IOutputCachePolicy:
public interface IOutputCachePolicy
{
// invocato prima che il middleware di cache sia eseguito
// qui possiamo configurare la maggior parte delle opzioni e abilitarlo/disabilitarlo
// in base alle nostre esigenze
ValueTask CacheRequestAsync(OutputCacheContext context, CancellationToken cancellation);
// invocato quando la risposta è stata trovata in cache, appena prima di restituirla
ValueTask ServeFromCacheAsync(OutputCacheContext context, CancellationToken cancellation);
// invocato prima di eseguire la risposta dal server, e quindi
// prima che venga memorizzata in cache
ValueTask ServeResponseAsync(OutputCacheContext context, CancellationToken cancellation);
}Per esempio, immaginiamo di voler implementare un sistema di telemetria con Application Insights, così da tracciare quando le richieste vengono servite tramite OutputCache.
Per farlo, possiamo creare la nostra ApplicationInsightsPolicy:
public class ApplicationInsightsPolicy : IOutputCachePolicy
{
private TelemetryClient _client;
public ApplicationInsightsPolicy(TelemetryClient client)
{
_client = client;
}
public ValueTask CacheRequestAsync(OutputCacheContext context, CancellationToken cancellation)
{
return ValueTask.CompletedTask;
}
public ValueTask ServeFromCacheAsync(OutputCacheContext context, CancellationToken cancellation)
{
_client.TrackEvent(new EventTelemetry("CacheHit")
{
Properties =
{
{ "Url", context.HttpContext.Request.GetDisplayUrl() },
{ "CacheTags", string.Join(",", context.Tags) }
}
});
return ValueTask.CompletedTask;
}
public ValueTask ServeResponseAsync(OutputCacheContext context, CancellationToken cancellation)
{
return ValueTask.CompletedTask;
}
}L'implementazione è davvero banale: quando la risposta viene servita dalla cache, l'OutputCacheMiddleware invocherà il metodo ServeFromCacheAsync, all'interno del quale abbiamo inserito la nostra logica di tracking tramite TelemetryClient.
Abbiamo poi lasciato vuoti gli altri metodi, per i quali non dobbiamo specificare alcuna logica.
A questo punto non ci resta che registrare la nostra custom policy nella BasePolicy, così che venga automaticamente associata a tutti gli endpoint per i quali l'output cache sia attivo:
builder.Services.AddOutputCache(config =>
{
config.AddBasePolicy(policy =>
{
policy.Expire(TimeSpan.FromMinutes(60));
policy.AddPolicy<ApplicationInsightsPolicy>();
});
});Se abbiamo configurato correttamente Application Insights, vedremo questo nostro evento apparire nei log, così che possiamo utilizzarlo per generare statistiche, dashboard e quant'altro.

Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Testare le API di Azure Resource Manager con API Playground
Avviare rapidamente un container con Azure Container Apps Express
Creare una cache temporanea in JavaScript
Integrare un LLM in ASP.NET Core con Microsoft.Extensions.AI
Breaking the Legacy Barrier: how to Use AI to Modernize Applications
Utilizzo del persistent state di Blazor nel prerendering
Ciclo di vita risorse con .NET Aspire
Global Azure 2026 - ASPItalia.com
Effettuare chiamate API tramite GitHub App
Cache temporanea in Javascript con oggetti
Migrare applicazioni legacy nel cloud con Azure App Service Managed Instance
Azure SQL Database per dev: tutte le novità da non perdere
I più letti di oggi
- Personalizare l'icona e le funzionalità di un sito web per iOS e IE
- Effettuare il multi-checkout in linea nelle pipeline di Azure DevOps
- Accedere a risorse e immagini in Windows Store app di Windows 8
- Effetto turnstile su tutte le pagine con il Windows Phone Toolkit
- Alleggerire le applicazioni WPF sfruttando gli oggetti Freezable
- Permettere il Drag-and-drop solo su zone predefinite con Silverlight 2.0
- Accedere a dati esposti con WebService con Silverlight 1.0
- Utilizzare dati in formato XML in XAML


