2009-02-10 4 views
21

Ich entwickle gegen eine proprietäre Bibliothek und ich habe einige Probleme mit dem Cache der HttpWebRequest. Die Bibliothek wird unter Verwendung von Code äquivalent unten an einem zum Anfragen zu machen:So löschen Sie den Cache von HttpWebRequest

var request = WebRequest.Create("http://example.com/") as HttpWebRequest; 

request.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.CacheIfAvailable); 

die externe Ressource nicht zuzulassen nicht caching obwohl jede Antwort unterscheidet. So bekomme ich jedes Mal die gleiche Antwort.

Gibt es eine Möglichkeit, den Inhalt des HttpWebRequest Cache zu löschen? Die richtige Lösung wäre, die externe Quelle zu reparieren oder vielleicht die Cache-Politik zu ändern, aber beides ist nicht möglich - daher die Frage.

Das Löschen des Caches könnte verschiedene Auswirkungen haben, daher wäre es am besten, den Cache pro Ressource zu entwerten.

+0

Was dies die Antwort war? Bradleys Antwort ist, was ich für richtig hielt, aber empirisch fand ich, dass das Löschen des IE-Cache (und das Verwenden von Fiddler) nicht funktionierte. –

+0

Ich weiß, dass dies vor einiger Zeit gefragt wurde, ich dachte, dass diese Frage [Cache in ASP.Net löschen] (http://stackoverflow.com/a/11641/128984) ebenfalls hilfreich sein könnte. – Micah

Antwort

12

Sie können die Cache-Richtlinie auf die Anforderung von NoCacheNoStore an die HttpWebRequest festlegen.

+1

Wie angegeben, ist es nicht möglich, die Cache-Richtlinie zu ändern. Ich möchte eine Lösung, um den Cache-Speicher tatsächlich zu löschen - Caching vollständig zu vermeiden. –

+0

Ich glaube, dass CyberMing korrekt ist. NoCacheNoStore löscht tatsächlich den Cache-Speicher für die angeforderte URL und ist möglicherweise genau das, wonach Sie suchen? > (aus der Dokumentation) HttpRequestCacheLevel.NoCacheNoStore ... Erfüllt niemals eine Anfrage, indem er Ressourcen aus dem Cache verwendet und die Ressource nicht zwischenspeichert. ** Wenn die Ressource im lokalen Cache vorhanden ist, wird sie entfernt ** ... – snowcode

+0

Ich war auf der Suche, wie man weiß, woher kommt die Antwort kommt aus (aus dem Cache oder nicht, weil Der Status ist immer 200, als ob kein Cache falls verwendet) und geben Sie mir die Antwort: IsFromcache. Vielen Dank. – MuiBienCarlota

0

Sie können die Cache-Richtlinie ändern: Verwenden Sie einen http-Reverse-Proxy und entfernen/ändern Sie die relevanten http-Header. Es ist ein Hack, aber es würde funktionieren und ziemlich einfach. Ich würde vorschlagen, dass Sie Apache httpd Server für diese Aufgabe verwenden (mit mod_proxy).

1

Ich habe es nicht versucht, aber eine Lösung könnte sein, eine beliebige Abfragezeichenfolge zu der URL hinzuzufügen, die angefordert wird.

Dieser Querystring würde sich jedes Mal ändern, vielleicht mit DateTime.Now, was bedeutet, dass die URL jedes Mal anders sein würde. Jede Anfrage würde dann angeblich neu angefordert werden.

10

HttpWebRequest verwendet System.Net.Cache.RequestCache zum Zwischenspeichern. Dies ist eine abstrakte Klasse; Die tatsächliche Implementierung in Microsoft CLR ist Microsoft.Win32.WinInetCache, die, wie der Name impliziert, die WinInet Funktionen für das Zwischenspeichern verwendet.

Dies ist derselbe Cache, der auch in Internet Explorer verwendet wird. Sie können den Cache also manuell löschen, indem Sie das Dialogfeld Browserverlauf löschen verwenden. (Tun Sie dies zunächst als Test, um sicherzustellen, dass die WinInet-Cache zu löschen Ihr Problem löst.)

Unter der Annahme, dass die WinInet-Cache zu löschen, das Problem löst, können Sie Dateien löschen programmatisch von P/Aufrufen zum DeleteUrlCacheEntry WinInet API:

public static class NativeMethods 
{ 
    [DllImport("WinInet.dll", PreserveSig = true, SetLastError = true)] 
    public static extern void DeleteUrlCacheEntry(string url); 
} 
+0

Sie Recht haben, ist Microsoft.Win32.WinInetCache beteiligt und Antwort wird von Microsoft.Win32.WinInetCache.ReadStream gelesen aber es bedeutet nicht, dass es gleiche Cache-Position als IE. – MuiBienCarlota

+3

@MuiBienCarlota: In der Praxis habe ich festgestellt, dass es ist. Soweit ich weiß, verwendet Internet Explorer weiterhin die WinInet-Cache-Funktionen; wenn sowohl sie als auch .NET unter demselben Benutzerkonto ausgeführt wird, werden die Dateien erstellt/gelöscht von 'CreateUrlCacheEntry' und' DeleteUrlCacheEntry' an der gleichen Stelle sein sollte. –

-1

Fügen Sie die folgende Zeile den Cache zu löschen, wie und wann der Webclient die Daten abruft:

Webclient.Headers.Add(HttpRequestHeader.CacheControl, "no-cache")