Ich versuche, die Daten eines Clients (programmgesteuert) auf meinen lokalen Computer herunterzuladen, und sein Webserver ist sehr, sehr langsam, was zu einer Zeitüberschreitung in meinem WebClient
Objekt führt.
Hier ist mein Code:
WebClient webClient = new WebClient();
webClient.Encoding = Encoding.UTF8;
webClient.DownloadFile(downloadUrl, downloadFile);
Gibt es eine Möglichkeit, ein unendliches Zeitlimit für dieses Objekt festzulegen? Oder wenn nicht, kann mir jemand mit einem Beispiel auf einem alternativen Weg helfen, dies zu tun?
Die URL funktioniert in einem Browser einwandfrei - die Anzeige dauert nur etwa 3 Minuten.
.TotalMilliseconds
und nicht.Milliseconds
!Die erste Lösung hat bei mir nicht funktioniert, aber hier ist ein Code, der bei mir funktioniert hat.
quelle
Sie müssen das Zeitlimit verwenden,
HttpWebRequest
anstatt es zuWebClient
aktivieren,WebClient
ohne es zu erweitern (obwohl es das verwendetHttpWebRequest
). Wenn SieHttpWebRequest
stattdessen die Option verwenden, können Sie das Zeitlimit festlegen.quelle
"Do not use the HttpWebRequest constructor. Use the WebRequest.Create method to initialize new HttpWebRequest objects."
von msdn.microsoft.com/en-us/library/… . Siehe auch stackoverflow.com/questions/400565/...Timeout
Eigenschaft von zu verwendenHttpWebRequest
. Es ist in Millisekunden.Der w.Timeout-Code konnte nicht funktionieren, wenn das Netzwerkkabel herausgezogen wurde. Es war einfach kein Zeitlimit, wurde auf die Verwendung von HttpWebRequest umgestellt und erledigt den Job jetzt.
quelle
var wresp = await request.GetResponseAsync();
anstelle von var verwenden, erhaltenwresp = (HttpWebResponse)request.GetResponse();
Sie wieder eine massive ZeitüberschreitungDer Vollständigkeit halber ist hier die auf VB portierte Lösung von kisp (Code kann keinem Kommentar hinzugefügt werden)
quelle
Wie Sohnee sagt, verwenden
System.Net.HttpWebRequest
und setzen Sie dieTimeout
Eigenschaft, anstatt zu verwendenSystem.Net.WebClient
.Sie können jedoch keinen unendlichen Zeitlimitwert festlegen (dieser wird nicht unterstützt, und wenn Sie dies versuchen, wird ein Wert ausgelöst
ArgumentOutOfRangeException
).Ich würde empfehlen, zuerst eine HEAD-HTTP- Anforderung auszuführen und den zurückgegebenen
Content-Length
Header-Wert zu untersuchen, um die Anzahl der Bytes in der heruntergeladenen Datei zu bestimmen, und dann den Timeout-Wert für die nachfolgendeGET
Anforderung entsprechend festzulegen oder einfach einen sehr langen Timeout-Wert anzugeben, den Sie möchten Erwarten Sie niemals zu überschreiten.quelle
quelle
Für alle, die einen WebClient mit einer Zeitüberschreitung benötigen, die für asynchrone / Task-Methoden funktioniert , funktionieren die vorgeschlagenen Lösungen nicht. Folgendes funktioniert:
Ich gebloggt die volle Abhilfe hier
quelle
Verwendung:
Klasse:
Aber ich empfehle eine modernere Lösung:
Es wird eine
OperationCanceledException
nach einer Auszeit werfen .quelle
In einigen Fällen muss ein Benutzeragent zu den Headern hinzugefügt werden:
Dies war die Lösung für meinen Fall.
Anerkennung:
http://genjurosdojo.blogspot.com/2012/10/the-remote-server-returned-error-504.html
quelle