Ciao,
1. devo inserire all'inizio della pagina <%@ OutputCache ... %> o non è necessario visto che salvo dei dati? Nel caso sia sì, che parametri devo passare?
No, OutputCache non sarebbe necessario se hai scelto di sfruttare l'
application cache con l'oggetto MemoryCache.
non trovo più i dati nella cache
Il valore deve necessariamente essere ancora lì in cache se la chiave è la stessa che avevi usato prima, per cachare il valore. Le mie ipotesi sono:
- Non ricostruisci la chiave in maniera esattamdete uguale, e questo ti dà l'illusione che la cache abbia perso il valore. Hai messo un breakpoint in corrispondenza del Get per verificare che la chiave sia la stessa e quale sia il valore restituito?
- Nel codice che hai postato fai prima il Set e poi il Get. Dovrebbe essere il contrario: prima cerchi di ottenere il valore dalla cache e, solo se il valore ottenuto è null, allora fai il Set;
- Oppure, quando torni indietro, ti aspetti di trovare i risultati nella pagina web ma ciò non avviene, e quindi il problema è nel javascript anziché nei risultati cache.
Personalmente, in questo caso, anziché MemoryCache userei l'OutputCache perché mi interessa cachare tutto il risultato JSON e non solo alcune parti. Questa considerazione è valida solo se stai invocando l'HttpHandler con una richiesta GET, altrimenti non funzionerebbe.
Andrebbe configurato così. Metti questo come ultimo codice nel corpo del metodo ProcessRequest.
// caching lato server
context.Response.Cache.SetCacheability(HttpCacheability.Server);
// 15 minuti di scadenza
context.Response.Cache.SetExpires(DateTime.Now.AddMinutes(15));
// La cache è considerata valida finché non scade
context.Response.Cache.SetValidUntilExpires(true);
// Le chiavi cache si differenziano al differenziarsi dei parametri querystring
context.Response.Cache.VaryByParams["*"] = true;
Se scegli per questa strada ricorda che tutti i parametri di ricerca vanno forniti via querystring e non via POST.
Così sei riuscito a riprodurre una soluzione equivalente a quella del MemoryCache, che è anche un pelo più efficiente perché il tuo handler non andrà in esecuzione se viene rilevato che la cache è ancora valida e la risposta può essere servita da lì.
ciao,
Moreno
Modificato da BrightSoul il 05 luglio 2016 08.59 -