C# WebClient de désactiver le cache
Bonjour.
j'utilise la classe WebClient
dans mon application C# afin de télécharger le même fichier chaque minute, puis l'application effectue un contrôle simple pour voir si le fichier a été modifié, et si elle fait quelque chose avec elle.
Eh bien, puisque ce fichier est téléchargé chaque minute le WebClient
système de mise en cache est la mise en cache du fichier, et de ne pas télécharger le fichier à nouveau, tout simplement obtenir à partir de la cache, et qui obtient dans le moyen de vérifier si le fichier téléchargé est nouveau.
alors je voudrais savoir comment désactiver le système de cache de la classe WebClient
.
j'ai essayé.
Client.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.BypassCache);
j'ai aussi essayé les en-têtes.
WebClient.Headers.Add("Cache-Control", "no-cache");
N'a pas fonctionné aussi bien. Alors, comment puis-je désactiver le cache pour de bon?
Merci.
MODIFIER
j'ai aussi essayé le suivant CacheLevels
: NoCacheNoStore
, BypassCache
, Reload
. Aucun effet, mais si je redémarre mon ordinateur le cache semble être effacé, mais je ne peux pas être redémarrer l'ordinateur à chaque fois.
mise à JOUR en face de l'activité récente (8 Jeu 2012)
la réponse marquée comme acceptée a résolu mon problème. Pour faire simple, j'ai utilisé Douilles à télécharger le fichier et qui a résolu mon problème. Fondamentalement, un demande pour le fichier souhaité, je n'entrerai pas dans les détails sur la façon de le faire, parce que je suis sûr que vous pouvez trouver beaucoup de "comment" ici ALORS dans afin de faire la même chose vous-même. Bien que cela ne signifie pas que ma solution est aussi la meilleure pour vous, mon premier conseil est de lire d'autres réponses et voir si elles sont utiles.
Eh bien, puisque ces questions ont vu une certaine activité récente, j'ai pensé à ajouter cette mise à jour pour inclure quelques conseils ou idées qui je pense devraient être considérés par ceux qui font face à des problèmes similaires qui ont essayé tout ce qu'ils pouvaient penser, et sont sûrs que le problème ne ment pas avec leur code. est probablement le code pour la plupart des cas, mais parfois nous ne le voyons pas tout à fait, il suffit d'aller faire une promenade et revenir après quelques minutes, et vous le verrez probablement à bout portant comme si c'était la chose la plus évidente en premier lieu.
Dans tous les cas, si vous êtes sûr, dans ce cas, je vous conseille de vérifier la météo de votre demande passe par un autre appareil avec des capacités de mise en cache (ordinateurs, routeurs, mandataires,...)...) jusqu'à ce qu'il arrive à destination.
considèrent que la plupart des demandes passent par certains de ces dispositifs mentionnés avant, plus généralement routeurs, sauf bien sûr, vous êtes directement connecté à la Internet via votre fournisseur de services réseau.
dans un quand mon propre routeur mettait en cache le fichier, odd je sais, mais c'était le cas, à chaque fois que je le redémarrais ou que je me connectais directement à Internet mon problème de mise en cache disparaissait. Et non il n'y avait pas d'autre appareil connecté au routeur qui puisse être blâmé, seulement l'ordinateur et le routeur.
et, soit dit en passant, un conseil général, bien qu'il s'applique principalement à ceux qui travaillent dans leur entreprise Ordinateurs de développement au lieu de leur propre. Peut par tout changement de votre ordinateur de développement être l'exécution d'un service de mise en cache de toutes sortes? Il est possible.
en outre considérer que de nombreux sites Web haut de gamme ou des services utilisent Réseaux de distribution (CDN), et selon le fournisseur CDN, chaque fois qu'un fichier est mis à jour ou modifié, cela prend un certain temps des modifications pour refléter dans l'ensemble du réseau. Par conséquent, il pourrait être il est possible que vous ayez eu la malchance de demander un dossier qui pourrait être au milieu d'une mise à jour, et le plus proche Serveur CA pour vous n'a pas terminé la mise à jour.
dans tous les cas , surtout si vous demandez toujours le même fichier encore et encore, ou si vous ne pouvez pas trouver où se trouve le problème, alors si possible, je vous conseille de reconsidérer votre approche en demandant le même fichier temps après temps, et à la place regarder dans la construction d'un simple service Web , pour satisfaire les besoins que vous avez d'abord pensé à satisfaire avec un tel fichier dans le première place.
et si vous envisagez une telle option, je pense que vous aurez probablement plus de temps pour construire un repos Style Web API pour vos propres besoins.
j'espère que cette mise à jour vous sera utile d'une façon ou d'une autre, c'est certain. Bonne chance avec votre code efforts.
12 réponses
D'après ce qui précède, je suppose que vous avez un problème ailleurs. Pouvez-vous enregistrer les requêtes http du côté du serveur? Qu'obtenez-vous lorsque vous modifier certains paramètre valeur aléatoire?
peut-être que le serveur cache le fichier (si le log montre que la requête est vraiment déclenchée à chaque minute.
utilisez-vous ISA ou SQUID?
Qu'est-ce que le code de réponse http pour votre requête?
je sais que répondre avec des réponses pourrait pas être populaire, mais le commentaire ne me permet pas ce texte Beaucoup :)
EDIT:
de toute façon , utilisez HttpRequest
objet au lieu de WebClient
, et avec un peu de chance (si vous placez vos doutes dans WebClient
) tout sera résolu. S'il n'a pas été résolu avec HttpRequest
, alors le problème est vraiment ailleurs.
affinement:
encore plus bas: comment créer une requête HTTP manuellement dans .Net?
ce sont des sockets purs, et si le problème persiste, alors ouvrez une nouvelle question et marquez-la WTF:)
vous pouvez essayer d'ajouter un certain nombre aléatoire à votre url dans le cadre d'un querystring chaque fois que vous téléchargez le fichier. Cela garantit que les urls sont uniques à chaque fois.
pour les ex -
Random random = new Random();
string url = originalUrl + "?random=" + random.Next().ToString();
webclient.DownloadFile(url, downloadedfileurl);
Essayer NoCacheNoStore
:
ne satisfait jamais une requête en utilisant des ressources du cache et ne cache pas de ressources. Si la ressource est présente dans le cache local, il est supprimé. Ce niveau de politique indique aux caches intermédiaires qu'elles devraient retirer la ressource. Dans le protocole de mise en cache HTTP, ceci est réalisé en utilisant la directive no-cache cache cache Control.
client.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.NoCacheNoStore);
dans certains scénarios, le logiciel de débogage réseau peut causer ce problème. Pour vous assurer que votre url n'est pas mise en cache, vous pouvez ajouter un nombre aléatoire comme dernier paramètre pour rendre l'url unique. Ce paramètre aléatoire dans la plupart des cas est ignoré par les serveurs (qui essaient de lire les paramètres envoyés en tant que paires de valeurs de nom).
exemple: http://www.someserver.com/?param1=val1&ThisIsRandom=RandomValue
où C'Estrandom=RandomValue est la nouvelle paramètre ajouté.
je suppose que vous devrez utiliser webrequest / webresponse plutôt que webclient
WebRequest request = WebRequest.Create(uri);
// Define a cache policy for this request only.
HttpRequestCachePolicy noCachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);
request.CachePolicy = noCachePolicy;
WebResponse response = request.GetResponse();
//below is the function for downloading the file
public static int DownloadFile(String remoteFilename,
String localFilename)
{
// Function will return the number of bytes processed
// to the caller. Initialize to 0 here.
int bytesProcessed = 0;
// Assign values to these objects here so that they can
// be referenced in the finally block
Stream remoteStream = null;
Stream localStream = null;
WebResponse response = null;
// Use a try/catch/finally block as both the WebRequest and Stream
// classes throw exceptions upon error
try
{
// Create a request for the specified remote file name
WebRequest request = WebRequest.Create(remoteFilename);
// Define a cache policy for this request only.
HttpRequestCachePolicy noCachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);
request.CachePolicy = noCachePolicy;
if (request != null)
{
// Send the request to the server and retrieve the
// WebResponse object
response = request.GetResponse();
if (response != null)
{
if (response.IsFromCache)
//do what you want
// Once the WebResponse object has been retrieved,
// get the stream object associated with the response's data
remoteStream = response.GetResponseStream();
// Create the local file
localStream = File.Create(localFilename);
// Allocate a 1k buffer
byte[] buffer = new byte[1024];
int bytesRead;
// Simple do/while loop to read from stream until
// no bytes are returned
do
{
// Read data (up to 1k) from the stream
bytesRead = remoteStream.Read(buffer, 0, buffer.Length);
// Write the data to the local file
localStream.Write(buffer, 0, bytesRead);
// Increment total bytes processed
bytesProcessed += bytesRead;
} while (bytesRead > 0);
}
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
finally
{
// Close the response and streams objects here
// to make sure they're closed even if an exception
// is thrown at some point
if (response != null) response.Close();
if (remoteStream != null) remoteStream.Close();
if (localStream != null) localStream.Close();
}
// Return total bytes processed to caller.
return bytesProcessed;
}
client.CachePolicy = new RequestCachePolicy(RequestCacheLevel.BypassCache);
devrait marcher. Assurez-vous juste de vider le cache et de supprimer tous les fichiers téléchargés temporairement dans Internet Explorer avant en exécutant le code comme System.Net
et C'est à dire que les deux utilisent le même cache.
j'ai eu un problème similaire avec powershell en utilisant webClient, qui était également présent après avoir changé pour utiliser webRequest. Ce que j'ai découvert, c'est que la socket est réutilisée et que cela provoque toutes sortes de cache Côté Serveur/réseau (et dans mon cas un équilibreur de charge est devenu trop problématique avec https). Le moyen de contourner cela est de désactiver keepalive et éventuellement pipeling dans l'objet webrequest comme ci-dessous qui va forcer une nouvelle prise pour chaque requête:
#Define Funcs Function httpRequest {
param([string]$myurl)
$r = [System.Net.WebRequest]::Create($myurl)
$r.keepalive = 0
$sr = new-object System.IO.StreamReader (($r.GetResponse()).GetResponseStream())
$sr.ReadToEnd() }
utiliser HTTPRequest
est certainement la bonne réponse pour votre problème. Cependant, si vous souhaitez empêcher votre WebBrowser / WebClient d'utiliser des pages mises en cache, vous devez inclure non seulement "no-cache"
mais tous ces en-têtes:
<meta http-equiv="Cache-control" content="no-cache">
<meta http-equiv="Cache-control" content="no-store">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="-1">
Dans IE11, il n'a pas fonctionné pour moi jusqu'à ce que j'ai inclus un ou les deux les deux derniers.
toutes les méthodes ici semblent ne peut pas résoudre un problème: Si une page web a déjà été accessible et maintenant supprimée du serveur, la méthode HttpWebResponse.GetResponse () vous donnera une réponse pour une copie mise en cache commençant par "avant qu'une période de temps suffisant ne soit passée, ou que vous redémarriez l'ordinateur, cela ne déclenchera pas l'exception prévue pour l'erreur 404 page not found, vous ne pouvez pas savoir que la page web n'exsit pas du tout maintenant.
j'ai tout essayé:
- Définir l'en-tête ("Cache-Control", "no-cache")
- Set "demande.CachePolicy " à "noCachePolicy "
- supprimer les fichiers GFT/history.
- utilisez Internet câblé sans routeur .......... NE FONCTIONNE PAS!
Heureusement, si la page web a changé de contenu, HttpWebResponse.GetResponse()
vous donnera une nouvelle page pour refléter le changement.
vérifiez que vous n'êtes pas limité de taux! Je récupérais ça d'un serveur nginx:
403 Interdit
Taux limité dépassé, s'il vous plaît essayer à nouveau dans 24 heures.voici le programme que j'utilisais (C#)
using System;
using System.IO;
using System.Net;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
DownloadFile();
Console.ReadLine();
}
public static void DownloadFile()
{
var downloadedDatabaseFile = Path.Combine(Path.GetTempPath(), Path.GetTempFileName());
Console.WriteLine(downloadedDatabaseFile);
var client = new WebClient();
client.DownloadProgressChanged += (sender, args) =>
{
Console.WriteLine("{0} of {1} {2}%", args.BytesReceived, args.TotalBytesToReceive, args.ProgressPercentage);
};
client.DownloadFileCompleted += (sender, args) =>
{
Console.WriteLine("Download file complete");
if (args.Error != null)
{
Console.WriteLine(args.Error.Message);
}
};
client.DownloadFileAsync(new Uri("http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dats.gz"), downloadedDatabaseFile);
}
}
}
la console imprime:
C:\Users\jake.scott.WIN-J8OUFV09HQ8\AppData\Local\Temp\tmp7CA.tmp
Download file complete
The remote server returned an error: (403) Forbidden.
puisque j'utilise le suivant:
wclient.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.NoCacheNoStore);
wclient.Headers.Add("Cache-Control", "no-cache");
Je n'ai plus de fichier caché.
j'ai en outre ajouté cette fonction que j'ai trouvé, pour supprimer les fichiers temp IE avant chaque appel:
private void del_IE_files()
{
string path = Environment.GetFolderPath(Environment.SpecialFolder.InternetCache);
//for deleting files
System.IO.DirectoryInfo DInfo = new DirectoryInfo(path);
FileAttributes Attr = DInfo.Attributes;
DInfo.Attributes = FileAttributes.Normal;
foreach (FileInfo file in DInfo.GetFiles())
{
file.Delete();
}
foreach (DirectoryInfo dir in DInfo.GetDirectories())
{
try
{
dir.Delete(true); //delete subdirectories and files
}
catch
{
}
}
}
si vous avez accès au serveur web, ouvrez Internet Explorer allez à
Internet Explorer
-> Internet Options
-> Browsing History "Settings"
-> Temporary Internet Files "never"
videz le Cache du navigateur et voilà, ça va marcher!