Cet article présente principalement l'implémentation du téléchargement de fichiers par WebClient en C#. L'éditeur pense que c'est plutôt bien, je vais donc le partager avec vous maintenant et le donner comme référence. Suivons l'éditeur pour y jeter un œil
Compte tenu de divers environnements réseau complexes, l'auteur a décidé d'utiliser différentes interfaces de programmation pour essayer le téléchargement afin d'augmenter la convivialité du programme.
Ici, nous présentons uniquement la méthode d'utilisation de WebClient, et les articles suivants présenteront d'autres méthodes. Le billet de blog présente principalement les idées et les codes clés, et la démo complète est jointe à la fin de l'article.
Utilisez un proxy pour accéder à Internet
De nombreux employés de l'entreprise accèdent à Internet via des proxys mis en place par l'entreprise. Accéder à Internet via un proxy vise principalement à permettre à l'entreprise d'effectuer divers contrôles. Bien entendu, il peut également mettre en œuvre certaines fonctions spéciales... Cependant, cela posera quelques problèmes à notre programme pour accéder au réseau.
En fait, l'API de WebClient est déjà très intelligente. Par exemple, l'objet HttpWebRequest que nous avons créé a un attribut Proxy. Autrement dit, WebHttpRequest utilisera par défaut le proxy trouvé. C'est génial et peut gérer de nombreuses situations. Toutefois, si ce proxy par défaut doit vérifier les informations d'identité des utilisateurs du domaine, l'utilisation de WebHttpRequest pour accéder au réseau peut échouer. Examinez maintenant la propriété Proxy.Credentials et constatez qu'elle est nulle.
Les informations d'identification par défaut du système peuvent être obtenues à partir de l'API WebClient, mais il n'est pas clair pourquoi la propriété Proxy.Credentials n'est pas définie sur cette valeur par défaut. Nous pouvons simplement le définir nous-mêmes.
request.Proxy.Credentials = CredentialCache.DefaultCredentials;
Mais l'environnement réseau réel peut être plus complexe, obligeant les utilisateurs à spécifier le proxy pour la mise en réseau et les informations d'identification requises pour la mise en réseau. L'écriture est la suivante :
myProxy = new WebProxy("proxyAddress"); myProxy.Credentials = new NetworkCredential(ProxyUserName, ProxyUserPasswd, DomainName);
Surmonter le cache
La mise en cache est partout , il y aura un cache dans le CDN côté serveur, et il y aura également un cache dans la couche proxy du client. Un problème courant est donc le suivant : même si les fichiers sur le serveur ont été mis à jour, certains clients téléchargent toujours les anciens fichiers. Traitons d'abord du problème de mise en cache du client.
La propriété CachePolicy.Level de HttpWebRequest est utilisée pour définir la politique de cache, mais sa valeur par défaut est BypassCache. On le change simplement en Reload :
Copiez le code Le code est le suivant :
request.CachePolicy = new System .Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.Reload);
L'étape suivante est le problème de mise en cache côté serveur.
De nos jours, tout le monde semble utiliser CDN, mais lors de l'utilisation, on constate souvent qu'il y a des problèmes de mise à jour du cache côté CDN. J'ai cherché en ligne et je n'ai trouvé aucune bonne solution, mais il existe une bonne solution de contournement, qui consiste à ajouter une chaîne aléatoire en tant que paramètre dans la requête.
Random rdm = new Random(); string s = rdm.Next().ToString(); myUrl += "?" + s;
Il convient de noter qu'en ce qui concerne la mise en cache, vous devez utiliser une stratégie qui correspond au cas d'utilisation actuel et ne peut pas être universelle. .
Processus de téléchargement plus convivial
Utilisez des barres de défilement pour afficher la progression du téléchargement, afficher la vitesse de téléchargement en temps réel et permettre aux utilisateurs d'annuler les téléchargements :
Ce qui suit est le code de base pour le téléchargement. Nous le divisons en calcul du pourcentage de téléchargement et calcul de la vitesse de téléchargement actuelle.
// 获得下载文件的长度 double contentLength = DownloadManager.GetContentLength(myHttpWebClient); byte[] buffer = new byte[BufferSize]; long downloadedLength = 0; long currentTimeSpanDataLength = 0; int currentDataLength; while ((currentDataLength = stream.Read(buffer, 0, BufferSize)) > 0 && !this._cancelDownload) { fileStream.Write(buffer, 0, currentDataLength); downloadedLength += (long)currentDataLength; currentTimeSpanDataLength += (long)currentDataLength; int intDownloadSpeed = 0; if (this._downloadStopWatch.ElapsedMilliseconds > 800) { double num5 = (double)currentTimeSpanDataLength / 1024.0; double num6 = (double)this._downloadStopWatch.ElapsedMilliseconds / 1000.0; double doubleDownloadSpeed = num5 / num6; intDownloadSpeed = (int)Math.Round(doubleDownloadSpeed, 0); this._downloadStopWatch.Reset(); this._downloadStopWatch.Start(); currentTimeSpanDataLength = 0; } double doubleDownloadPersent = 0.0; if (contentLength > 0.0) { doubleDownloadPersent = (double)downloadedLength / contentLength; } }
Calculez le pourcentage de téléchargement pendant le processus de téléchargement
Vous devez d'abord pour commencer Obtenir la longueur du fichier à télécharger dans la requête http Pour plus de détails, veuillez vous référer à la démo incluse dans cet article.
double contentLength = DownloadManager.GetContentLength(myHttpWebClient);
Chaque fois que des données sont lues à partir du flux de fichiers, nous savons combien d'octets ont été lus (currentDataLength), et cumulativement, cela signifie qu'il a été téléchargé jusqu'à présent dans la longueur du fichier.
downloadedLength += (long)currentDataLength;
Ensuite, faites simplement une division :
doubleDownloadPersent = (double)downloadedLength / contentLength;
Calculer la vitesse de téléchargement en temps réel
Pour la vitesse de téléchargement actuelle, nous calculons le nombre d'octets téléchargés au cours de la période écoulée. La période de temps peut être obtenue à l'aide de StopWatch. La période de temps que j'ai sélectionnée nécessite plus de 800 millisecondes.
if (this._downloadStopWatch.ElapsedMilliseconds > 800) { /***********************************/ // 计算上一个时间段内的下载速度 double num5 = (double)currentTimeSpanDataLength / 1024.0; double num6 = (double)this._downloadStopWatch.ElapsedMilliseconds / 1000.0; double doubleDownloadSpeed = num5 / num6; /***********************************/ intDownloadSpeed = (int)Math.Round(doubleDownloadSpeed, 0); // 本次网速计算完成后重置时间计时器和数据计数器,开始下次的计算 this._downloadStopWatch.Reset(); this._downloadStopWatch.Start(); currentTimeSpanDataLength = 0; }
En fait, la durée de la période de calcul de la vitesse de téléchargement n'est pas fixe, mais cela n'affecte pas uniquement les résultats du calcul. il faut s'assurer que la distance est bonne. Ce n'est pas grave si le calcul prend plus de 800 millisecondes.
Autoriser l'utilisateur à annuler le téléchargement
Pour une tâche qui prend beaucoup de temps à s'exécuter, ne pas autoriser l'utilisateur à l'annuler est profondément détesté ! Surtout quand la vitesse d'Internet n'est pas très bonne. Nous devons donc donner le choix aux utilisateurs : ils peuvent terminer le voyage en cours avec bonheur (plutôt que douloureusement).
Et c’est si simple pour nous !
Le code est le suivant :
while ((currentDataLength = stream.Read(buffer, 0, BufferSize)) > 0 && !this._cancelDownload){}
Lors de la lecture des données du flux de données, nous vérifions si l'utilisateur a appuyé sur le bouton "Annuler", qui est celui-ci._cancelTélécharger ici variable. Si c'est vrai, mettez fin au téléchargement en cours.
À ce stade, les plaintes les plus courantes des utilisateurs ont été résolues. En fait, peu de code a été ajouté et chaque point de connaissance semble si subtil. Mais cela améliore évidemment l’expérience utilisateur. Cela nous a également apporté un peu d'inspiration. L'exécution des fonctions principales n'est peut-être qu'une partie du travail. D'autres tâches peuvent ne pas être si évidentes et nous obligent à expérimenter et à découvrir constamment...
Adresse de téléchargement de la démo : WebClientDemo_jb51. rar
Ce qui précède est l'explication graphique et textuelle du code de téléchargement du fichier d'implémentation WebClient en C# Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !