2010-05-13 6 views
7

In meiner ASP.NET-App verwende ich HttpWebRequest zum Abrufen externer Ressourcen, die ich zwischengespeichert werden möchte. Betrachten Sie den folgenden Code ein:Wie erzwinge HttpWebRequest Cache in ASP.NET-Umgebung zu verwenden?

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 verwendet IE-Cache, so dass, wenn ich es als normaler Benutzer ausgeführt (in winzigen cmd Test app), werden die Daten zwischengespeichert %userprofile%\Local Settings\Temporary Internet Files und nächste Antworten werden aus dem Cache gelesen.

Ich dachte, dass, wenn solcher Code in ASP.NET App ausgeführt wird, Daten in ...\ASPNET\Local Settings\Temporary Internet Files zwischengespeichert werden, aber es ist nicht und Cache wird nie verwendet.

Was mache ich falsch? Wie erzwinge HttpWebRequest Cache in ASP.NET-Umgebung zu verwenden?

+0

Welches Konto ist Ihre ASP.NET app unter fliessendem? Der Cache wird unter diesem Konto erstellt. – feroze

+0

@feroze: Die App läuft unter ASPNET-Konto und ich kenne den Pfad für temporäre Internetdateien von der Untersuchung von Environment.SpecialFolder.InternetCache. Das Problem ist nicht, dass ich nicht weiß, wo Cache-Einträge erstellt werden, aber sie werden überhaupt nicht erstellt. – piotrsz

+0

Können Sie eine Zeile hinzufügen, um das Antwortobjekt zu schließen und zu entfernen: resp.Close(); und dann überprüfe, ob du immer noch Probleme hast? – feroze

Antwort

0

Ich könnte falsch liegen, aber ich würde vermuten, dass HttpWebRequest Cache-Header von der Ressource respektiert, unabhängig von Ihren angegebenen Wünschen.

Überprüfen Sie die Antwortheader und stellen Sie sicher, dass die Ressource nicht explizit aufgefordert wird, nicht zwischengespeichert zu werden.

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

Sie verwenden diese Methode, wie Sie Caching mit in web.config verwenden würde:

+1

Ich vermutete Header auch, also baue ich eine kleine Cmd-App, die HTprequest auf die gleiche Ressource macht. In cmd app ist es zwischengespeichert. Und in der ASP.NET App ist es nicht. – piotrsz

1

Sie können den Cache manuell in Ihrem Code verwenden.

+0

Ich werde wahrscheinlich am Ende benutzerdefinierte Cache implementieren, aber ich hatte gehofft für einige einfache "Out of the Box" -Lösung ... – piotrsz

+0

Ich denke, es gibt keine out-of-the-Box für Ihr Problem, aber das sollte kein großes Problem sein implementieren. – MUG4N

1

Ich weiß, dass dies ein alter Thread ist, aber eine andere Sache in Bezug auf dieses Problem sind die IE-Sicherheitseinstellungen für das Benutzerkonto, unter dem die ASP.NET-Anwendung ausgeführt wird. HTTP-Caching (CachePolicy.Level = Default, HTTP-cachefähige Ressourcen) funktionierte nicht für unsere Anwendung, bis wir den Remote-Host der Liste der vertrauenswürdigen Sites hinzugefügt haben.

Dieser Artikel war nützlich für unsere Cache-Fehlerbehebung: http://blogs.msdn.com/b/ieinternals/archive/2011/03/19/wininet-temporary-internet-files-cache-and-explorer-folder-view.aspx

Verwandte Themen