Heim > Backend-Entwicklung > C#.Net-Tutorial > Detaillierte grafische Erläuterung des von WebClient in C# implementierten Datei-Download-Codes

Detaillierte grafische Erläuterung des von WebClient in C# implementierten Datei-Download-Codes

黄舟
Freigeben: 2017-03-07 11:45:39
Original
2591 Leute haben es durchsucht

Dieser Artikel stellt hauptsächlich die Implementierung des Datei-Downloads durch WebClient in C# vor. Der Herausgeber findet ihn recht gut, daher werde ich ihn jetzt mit Ihnen teilen und als Referenz geben. Folgen wir dem Editor und werfen wir einen Blick darauf

Angesichts verschiedener komplexer Netzwerkumgebungen hat der Autor beschlossen, verschiedene Programmierschnittstellen zu verwenden, um das Herunterladen zu versuchen und die Benutzerfreundlichkeit des Programms zu erhöhen.

Hier stellen wir nur die Methode zur Verwendung von WebClient vor, und in den folgenden Artikeln werden andere Methoden vorgestellt. Der Blog-Beitrag stellt hauptsächlich die Ideen und Schlüsselcodes vor, und die vollständige Demo ist am Ende des Artikels angehängt.

Verwenden Sie einen Proxy, um auf das Internet zuzugreifen

Viele Mitarbeiter des Unternehmens greifen über vom Unternehmen eingerichtete Proxys auf das Internet zu. Der Zugriff auf das Internet über einen Proxy dient hauptsächlich dazu, dem Unternehmen die Durchführung verschiedener Kontrollen zu erleichtern. Natürlich können auch einige Sonderfunktionen implementiert werden. Dies führt jedoch zu einigen Problemen für den Zugriff unseres Programms auf das Netzwerk.

Tatsächlich ist die API in WebClient bereits sehr intelligent. Das von uns erstellte HttpWebRequest-Objekt verfügt beispielsweise über ein Proxy-Attribut. Das heißt, WebHttpRequest verwendet standardmäßig den gefundenen Proxy. Das ist großartig und kann mit vielen Situationen umgehen. Wenn dieser Standard-Proxy jedoch die Identitätsinformationen von Domänenbenutzern überprüfen muss, schlägt die Verwendung von WebHttpRequest für den Zugriff auf das Netzwerk möglicherweise fehl. Schauen Sie sich nun die Eigenschaft Proxy.Credentials an und stellen Sie fest, dass sie null ist.

Die Standardanmeldeinformationen des Systems können von der WebClient-API abgerufen werden, es ist jedoch nicht klar, warum die Proxy.Credentials-Eigenschaft nicht standardmäßig auf diesen Wert festgelegt ist. Wir können es einfach selbst festlegen.

request.Proxy.Credentials = CredentialCache.DefaultCredentials;
Nach dem Login kopieren

Aber die tatsächliche Netzwerkumgebung kann komplexer sein, da Benutzer den Proxy für das Netzwerk und die für das Netzwerk erforderlichen Anmeldeinformationen angeben müssen. Der Text lautet wie folgt:

myProxy = new WebProxy("proxyAddress"); 
myProxy.Credentials = new NetworkCredential(ProxyUserName, ProxyUserPasswd, DomainName);
Nach dem Login kopieren

Cache überwinden

Caching ist überall , wird es einen Cache im serverseitigen CDN geben, und es wird auch einen Cache in der Proxy-Schicht des Clients geben. Ein häufiges Problem ist also: Obwohl die Dateien auf dem Server aktualisiert wurden, laden einige Kunden immer noch die alten Dateien herunter. Befassen wir uns zunächst mit dem Caching-Problem des Clients.

Die CachePolicy.Level-Eigenschaft von HttpWebRequest wird zum Festlegen der Cache-Richtlinie verwendet, ihr Standardwert ist jedoch BypassCache. Wir ändern es einfach in „Neu laden“:


Kopieren Sie den Code Der Code lautet wie folgt:


request.CachePolicy = new System .Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.Reload);

Der nächste Schritt ist das serverseitige Caching-Problem.

Heutzutage scheint jeder CDN zu verwenden, aber während der Nutzung stellt sich häufig heraus, dass es Probleme mit der Cache-Aktualisierung auf der CDN-Seite gibt. Ich habe online gesucht und keine gute Lösung gefunden, aber es gibt einen guten Workaround, der darin besteht, der Anfrage eine zufällige Zeichenfolge als Parameter hinzuzufügen.

Random rdm = new Random();
string s = rdm.Next().ToString();
myUrl += "?" + s;
Nach dem Login kopieren

Es ist zu beachten, dass Sie beim Caching eine Strategie verwenden müssen, die zum aktuellen Anwendungsfall passt und keine Einheitslösung sein darf .

Benutzerfreundlicherer Download-Prozess

Verwenden Sie Bildlaufleisten, um den Download-Fortschritt anzuzeigen, die Download-Geschwindigkeit in Echtzeit anzuzeigen und Benutzern das Abbrechen von Downloads zu ermöglichen:

Das Folgende ist der Kerncode zum Herunterladen. Wir unterteilen ihn in die Berechnung des Download-Prozentsatzes und die Berechnung der aktuellen Download-Geschwindigkeit.

// 获得下载文件的长度
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;
 }
}
Nach dem Login kopieren

Berechnen Sie den Download-Prozentsatz während des Downloadvorgangs

Zuerst benötigen Sie Um zu beginnen, ermitteln Sie die Länge der herunterzuladenden Datei in der HTTP-Anfrage. Weitere Informationen finden Sie in der in diesem Artikel enthaltenen Demo.

double contentLength = DownloadManager.GetContentLength(myHttpWebClient);
Nach dem Login kopieren

Jedes Mal, wenn Daten aus dem Dateistream gelesen werden, wissen wir, wie viele Bytes gelesen wurden (currentDataLength), und kumulativ bedeutet dies, dass dies der Fall ist Bisher heruntergeladene Dateilänge.

downloadedLength += (long)currentDataLength;
Nach dem Login kopieren

Dann machen Sie einfach eine Division:

doubleDownloadPersent = (double)downloadedLength / contentLength;
Nach dem Login kopieren

Download-Geschwindigkeit in Echtzeit berechnen

Für die aktuelle Download-Geschwindigkeit berechnen wir die Anzahl der im vergangenen Zeitraum heruntergeladenen Bytes. Der Zeitraum kann mit StopWatch ermittelt werden. Der von mir ausgewählte Zeitraum erfordert mehr als 800 Millisekunden.

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;
}
Nach dem Login kopieren

Tatsächlich ist die Länge des Zeitraums für die Berechnung der Download-Geschwindigkeit nicht festgelegt, dies hat jedoch keinen Einfluss auf die Berechnungsergebnisse Sie müssen sicherstellen, dass der Abstand beträgt. Es ist in Ordnung, wenn die Berechnung mehr als 800 Millisekunden dauert.

Dem Benutzer erlauben, den Download abzubrechen

Für eine Aufgabe, deren Ausführung lange dauert, ist es nicht möglich, dass der Benutzer sie abbrechen kann zutiefst gehasst! Vor allem, wenn die Internetgeschwindigkeit nicht sehr gut ist. Wir müssen den Benutzern also die Wahl lassen: Sie können die aktuelle Reise glücklich (und nicht schmerzhaft) beenden.

Und bei uns ist das alles so einfach!

Der Code lautet wie folgt:

while ((currentDataLength = stream.Read(buffer, 0, BufferSize)) > 0 && !this._cancelDownload){}
Nach dem Login kopieren

Beim Lesen von Daten aus dem Datenstrom prüfen wir, ob der Benutzer die Schaltfläche „Abbrechen“ gedrückt hat. Dies ist dieser._cancelDownload hier Variable. Wenn dies der Fall ist, beenden Sie den aktuellen Download.

Zu diesem Zeitpunkt wurden die häufigsten Beschwerden von Benutzern behoben. Tatsächlich wurde nicht viel Code hinzugefügt und jeder Wissenspunkt scheint so subtil zu sein. Aber es verbessert offensichtlich das Benutzererlebnis. Dies hat uns auch einige Inspirationen gebracht. Andere Aufgaben sind möglicherweise nicht so offensichtlich und erfordern ständiges Erleben und Entdecken...

Demo-Download-Adresse: WebClientDemo_jb51. rar

Das Obige ist die grafische und textliche Erklärung des WebClient-Implementierungsdatei-Downloadcodes in C#. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn).


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage