Come utilizzare la cache di output sul gestore .ashx

Come posso usare la cache di output con un gestore .ashx? In questo caso sto facendo un po ‘di pesante elaborazione delle immagini e vorrei che il gestore venisse memorizzato nella cache per un minuto circa.

Inoltre, qualcuno ha qualche suggerimento su come prevenire la dogpiling?

Esistono alcune buone fonti ma si desidera memorizzare nella cache l’elaborazione lato server e lato client.

L’aggiunta di intestazioni HTTP dovrebbe aiutare nella memorizzazione nella cache del client

ecco alcuni header di risposta per iniziare ..

Puoi passare ore a modificarli finché non ottieni la performance desiderata

//Adds document content type context.Response.ContentType = currentDocument.MimeType; context.Response.Cache.SetCacheability(HttpCacheability.Public); context.Response.Cache.SetExpires(DateTime.Now.AddMinutes(10)); context.Response.Cache.SetMaxAge(new TimeSpan(0,10,0)); context.Response.AddHeader("Last-Modified", currentDocument.LastUpdated.ToLongDateString()); // Send back the file content context.Response.BinaryWrite(currentDocument.Document); 

Per quanto riguarda la cache sul lato server, questo è un mostro diverso … e ci sono un sacco di risorse di caching là fuori …

puoi usare così

 public class CacheHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { OutputCachedPage page = new OutputCachedPage(new OutputCacheParameters { Duration = 60, Location = OutputCacheLocation.Server, VaryByParam = "v" }); page.ProcessRequest(HttpContext.Current); context.Response.Write(DateTime.Now); } public bool IsReusable { get { return false; } } private sealed class OutputCachedPage : Page { private OutputCacheParameters _cacheSettings; public OutputCachedPage(OutputCacheParameters cacheSettings) { // Tracing requires Page IDs to be unique. ID = Guid.NewGuid().ToString(); _cacheSettings = cacheSettings; } protected override void FrameworkInitialize() { // when you put the <%@ OutputCache %> directive on a page, the generated code calls InitOutputCache() from here base.FrameworkInitialize(); InitOutputCache(_cacheSettings); } } } 

Vecchio, domanda ma la risposta in realtà non ha menzionato la gestione lato server.

Come nella risposta vincente, lo userei per il client side :

 context.Response.Cache.SetCacheability(HttpCacheability.Public); context.Response.Cache.SetExpires(DateTime.Now.AddMinutes(10)); context.Response.Cache.SetMaxAge(TimeSpan.FromMinutes(10)); 

e per il server side , dato che stai usando un ashx invece di una pagina web, suppongo che tu stia scrivendo direttamente l’output su Context.Response .

In questo caso potresti usare qualcosa del genere (in questo caso voglio salvare la risposta in base al parametro “q”, e Im usando una scadenza della finestra scorrevole)

 using System.Web.Caching; public void ProcessRequest(HttpContext context) { string query = context.Request["q"]; if (context.Cache[query] != null) { //server side caching using asp.net caching context.Response.Write(context.Cache[query]); return; } string response = GetResponse(query); context.Cache.Insert(query, response, null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(10)); context.Response.Write(response); } 

Ho usato il seguente successo e ho pensato che valesse la pena di postare qui.

Controllo manuale della cache di output della pagina ASP.NET

Da http://dotnetperls.com/cache-examples-aspnet

Impostazione delle opzioni della cache nei file Handler.ashx

Innanzitutto, è ansible utilizzare i gestori HTTP in ASP.NET per un modo più rapido per il contenuto dinamico del server rispetto alle pagine Web Form. Handler.ashx è il nome predefinito per un gestore generico ASP.NET. È necessario utilizzare il parametro HttpContext e accedere alla risposta in questo modo.

Esempio di codice estratto:

 <%@ WebHandler Language="C#" Class="Handler" %> 

C # per memorizzare la risposta della cache per 1 ora

 using System; using System.Web; public class Handler : IHttpHandler { public void ProcessRequest (HttpContext context) { // Cache this handler response for 1 hour. HttpCachePolicy c = context.Response.Cache; c.SetCacheability(HttpCacheability.Public); c.SetMaxAge(new TimeSpan(1, 0, 0)); } public bool IsReusable { get { return false; } } } 

La soluzione con OutputCachedPage funziona correttamente , tuttavia a un prezzo delle prestazioni, poiché è necessario creare un’istanza di un object derivato dalla class base System.Web.UI.Page .

Una soluzione semplice sarebbe utilizzare Response.Cache.SetCacheability , come suggerito da alcune delle risposte precedenti. Tuttavia, affinché la risposta sia memorizzata nella cache sul server (all’interno della cache di output) è necessario utilizzare HttpCacheability.Server e impostare VaryByParams o VaryByHeaders (si noti che quando si utilizza VaryByHeaders l’ URL non può contenere una stringa di query, poiché la cache verrà saltata ).

Ecco un semplice esempio (basato su https://support.microsoft.com/en-us/kb/323290 ):

 <%@ WebHandler Language="C#" Class="cacheTest" %> using System; using System.Web; using System.Web.UI; public class cacheTest : IHttpHandler { public void ProcessRequest(HttpContext context) { TimeSpan freshness = new TimeSpan(0, 0, 0, 10); DateTime now = DateTime.Now; HttpCachePolicy cachePolicy = context.Response.Cache; cachePolicy.SetCacheability(HttpCacheability.Public); cachePolicy.SetExpires(now.Add(freshness)); cachePolicy.SetMaxAge(freshness); cachePolicy.SetValidUntilExpires(true); cachePolicy.VaryByParams["id"] = true; context.Response.ContentType = "application/json"; context.Response.BufferOutput = true; context.Response.Write(context.Request.QueryString["id"]+"\n"); context.Response.Write(DateTime.Now.ToString("s")); } public bool IsReusable { get { return false; } } } 

Suggerimento: si monitora la memorizzazione nella cache nei contatori delle prestazioni “Applicazioni ASP.NET__Totale __ \ Totale cache di output”.