2010-05-13 12 views
7

Nella mia app ASP.NET utilizzo HttpWebRequest per prelevare risorse esterne che vorrei memorizzare nella cache. Si consideri il seguente codice:Come forzare HttpWebRequest a utilizzare la cache nell'ambiente ASP.NET?

var req = WebRequest.Create("http://google.com/"); 
req.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.CacheIfAvailable); 
var resp = req.GetResponse(); 
Console.WriteLine(resp.IsFromCache); 
var answ = (new StreamReader(resp.GetResponseStream())).ReadToEnd(); 
Console.WriteLine(answ.Length); 

HttpWebRequest utilizza cache di IE, così quando ho eseguito come utente normale (in minuscolo prova cmd app), i dati vengono memorizzati nella cache per %userprofile%\Local Settings\Temporary Internet Files e successive risposte vengono letti dalla cache.

Ho pensato che quando tale codice viene eseguito all'interno dell'app ASP.NET, i dati verranno memorizzati nella cache su ...\ASPNET\Local Settings\Temporary Internet Files ma non lo è e la cache non viene mai utilizzata.

Cosa sto facendo male? Come forzare HttpWebRequest ad utilizzare la cache nell'ambiente ASP.NET?

+0

Qual è il tuo conto ASP.NET applicazione in esecuzione in? La cache verrà creata con quell'account. – feroze

+0

@feroze: l'app è in esecuzione con account ASPNET e conosco il percorso dei file temporanei di Internet dall'esame di Environment.SpecialFolder.InternetCache. Il problema non è che non so dove vengono create le voci della cache ma non vengono create affatto. – piotrsz

+0

È possibile aggiungere una linea per chiudere e disporre l'oggetto risposta: resp.Close(); e poi controlla se hai ancora problemi? – feroze

risposta

0

Potrei sbagliarmi ma sospetterei che HttpWebRequest rispetti le intestazioni della cache dalla risorsa indipendentemente dai desideri dichiarati.

Controllare le intestazioni di risposta e assicurarsi che la risorsa non stia chiedendo esplicitamente di non essere memorizzata nella cache.

+1

Sospettavo anche le intestazioni, quindi costruisco una piccola app cmd che rende httprequest la stessa risorsa. Nell'app cmd è memorizzato nella cache. E nell'app ASP.NET non lo è. – piotrsz

1

È possibile utilizzare la cache manualmente nel codice come questo:

Cache.Insert("request", req, Nothing, DateTime.Now, TimeSpan.FromSeconds(30), TimeSpan.Zero) 

È possibile utilizzare questo metodo, come si usa la cache con in web.config.

+0

Probabilmente finirò per implementare la cache personalizzata, ma speravo in una soluzione semplice e immediata ... – piotrsz

+0

Penso che non ci siano problemi per il tuo problema, ma questo non dovrebbe essere un grosso problema strumento. – MUG4N

1

So che questo è un thread vecchio, ma un'altra cosa da considerare per quanto riguarda questo problema è le impostazioni di sicurezza IE per l'account utente in cui l'applicazione ASP.NET è in esecuzione. La memorizzazione nella cache HTTP (CachePolicy.Level = Default, le risorse cachebili HTTP) non funzionava per la nostra applicazione finché non abbiamo aggiunto l'host remoto all'elenco dei siti attendibili.

Questo articolo è stato utile per la nostra cache di risoluzione dei problemi: http://blogs.msdn.com/b/ieinternals/archive/2011/03/19/wininet-temporary-internet-files-cache-and-explorer-folder-view.aspx

Problemi correlati