Ich versuche eine einfache Methode zum Herunterladen einer Datei von einem FTP mit FtpWebRequest
mit der Methode WebRequestMethods.Ftp.DownloadFile
zu erstellen. Das Problem ist, dass ich den Fortschritt des Herunterladens anzeigen möchte und daher die Dateigröße voraus wissen muss, um den übertragenen Prozentsatz berechnen zu können. Aber wenn ich GetResponse
in FtpWebRequest
aufruft, ist% ContentLength
-1.
OK - damit erhalte ich die Größe der Datei im Voraus mit der Methode WebRequestMethods.Ftp.GetFileSize
. Kein Problem. Nachdem ich die Größe erhalten habe, lade ich die Datei herunter.
Hier erscheint das Problem ...
Nachdem ich die Größe erreicht habe, versuche ich% ce_de% wiederzuverwenden und setze die Methode auf FtpWebRequest
zurück. Dies führt dazu, dass WebRequestMethods.Ftp.DownloadFile
etwas wie "Kann diese Aktion nach dem Senden der Anfrage nicht ausführen" sagt. (möglicherweise nicht die genaue Formulierung - übersetzt von dem, den ich auf Schwedisch bekomme).
Ich habe an anderer Stelle gefunden, dass, solange ich die Eigenschaft System.InvalidOperationException
auf true setze, es keine Rolle spielt, dass die Verbindung aktiv bleibt. Das verstehe ich nicht. Das einzige Objekt, das ich erstellt habe, ist mein Objekt KeepAlive
. Und wenn ich einen anderen erzeuge, wie kann er wissen, welche Verbindung zu verwenden ist? Und welche Anmeldeinformationen?
Pseudocode:
%Vor% Jetzt habe ich die Dateigröße. Also ist es Zeit, die Datei herunterzuladen. Die Einstellung Methode know verursacht die oben erwähnte Ausnahme. Also erstelle ich ein neues FtpWebRequest
? Oder gibt es trotzdem eine Zurücksetzung der Anfrage zur Wiederverwendung? (Das Schließen der Antwort machte keinen Unterschied.)
Ich verstehe nicht, wie ich vorwärts gehen kann, ohne das Objekt neu zu erstellen. Ich könnte das tun, aber es fühlt sich einfach nicht richtig an. Also poste ich hier in der Hoffnung, den richtigen Weg zu finden, dies zu tun.
Hier ist der (nicht funktionierende) Code (Eingaben sind sURI, sDiskName, sUser und sPwd.):
%Vor%Ich hoffe, dass jemand erklären kann, wie das funktionieren soll. Vielen Dank im Voraus.
Ich denke nicht, dass das beantwortet wird, also schließe ich es, indem ich dir sage, wie ich es gelöst habe.
Nun, ich habe es nicht wirklich gelöst. Ich habe jedoch den Download getestet, indem ich FtpWebRequest
neu erstellt habe, und festgestellt, dass er sich auf dem FTP-Server wie gewünscht verhält, d. H. Nur einmal anmeldet und dann meine Anfragen sequentiell ausführt.
So hat der Code die Dateigröße erreicht und den Download gestartet:
%Vor% Also keine Antwort, wenn es möglich ist, das FtpWebRequest
zur Wiederverwendung zurückzusetzen. Aber zumindest weiß ich, dass keine redundanten Informationen übertragen werden.
Danke an alle, die sich dafür interessiert haben und Zeit damit verbracht haben, an eine Antwort zu denken.
FtpWebRequest kann nur für eine Anforderung verwendet werden, z. B. zum Abrufen der Dateigröße oder zum Herunterladen der Datei, aber nicht für beide. Sie müssen 2 FtpWebRequests erstellen. Hinter der Szene merkt FtpWebRequest, dass es die gleiche URL und Anmeldeinformationen ist und die gleiche ftp-Verbindung wiederverwendet, ohne sie zu schließen, solange IsKeepAlieve true ist, was die Standardeinstellung ist.
Dies ist ein trauriges Beispiel für schlechtes Design von Microsoft. Anstatt uns explizit eine Verbindung öffnen und schließen zu lassen, wollen sie es automatisch für uns tun und alle verwirren.
Sie werden wahrscheinlich die Async-Methode verwenden wollen. Hier ist der Link zum MSDN-Dokument.
%Vor%Damit wird Ihre Anwendung nicht blockiert, so dass Sie
nicht verwenden müssen %Vor%Sie können auch nach einer alternativen FTP-Bibliothek suchen. Imo die FtpWebRequest ist nicht gerade die beste FTP-Klasse. Eine schnelle Suche ergab diese Bibliothek. Ftp ist nicht staatenlos wie HTTP. Ich bevorzuge Bibliotheken, mit denen Sie einen Client erstellen, eine Verbindung öffnen und die Verbindung aufrechterhalten können.
Hier ist der Code, den ich gefunden habe
%Vor%Die Quelle ist ebenfalls vorhanden, so dass Sie möglicherweise einige Ereignisse für den Download-Prozess an den Lesevorgang anhängen können.
Tags und Links .net c# ftp ftpwebrequest