5 Stimmen

FTP-Upload mit .NET

Ich schreibe einen Code zum Hochladen einer Zip-Datei auf einen FTP-Server. Überraschenderweise funktioniert der Code gut für kleine Dateien, aber mit größeren Dateien lande ich in Problem. Ich verwende das Stream-Objekt, und ich habe festgestellt, dass mein Code beim Versuch, den Stream zu schließen, stecken bleibt (nur bei großen Dateien). Der Code läuft gut, wenn ich den Stream nicht schließe (auch nicht bei großen Dateien). Kann jemand eine Logik erkennen, warum dies der Fall ist? Und wenn ich den Stream nicht schließe, ist es möglich, dass ich in Zukunft ein Problem bekomme.

Code-Auszug:

FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(@"ftp://" + ftpServerIP + @"/" + fileInf.Name));
Stream strm = reqFTP.GetRequestStream();

Der Code reagiert nicht mehr (wenn die hochgeladene Datei groß ist) bei:

strm.Close();

Es gibt keine Ausnahme, da dieser Teil innerhalb von try-catch liegt.

Ich weiß nicht, wie ich einen Stack-Trace erhalten kann.

6voto

Jacob Punkte 75084

Ich weiß nicht genau, welche Fehlermeldung Sie beim Schließen des Streams erhalten, aber in unserer Anwendung werden viele große Dateien hochgeladen (Videos und Bilder). Hier sehen Sie, wie wir in unseren FTP-Stream schreiben:

request.KeepAlive = false; // This eliminated some of our stream closing problems

using (Stream stream = request.GetRequestStream())
{
    stream.Write(file.Data, 0, file.Data.Length);
}

Ich dachte, dass die Durchführung einer using Block würde effektiv die Close aufruft, aber vielleicht führt er auch andere notwendige Bereinigungen durch. Beachten Sie auch, dass ich die FTP-Keepalives deaktiviert habe, die uns bei einigen FTP-Sites von Drittanbietern, auf die wir hochgeladen haben, Probleme bereitet haben.

Sie sollten sich wirklich die spezifische Ausnahme ansehen, die Sie erhalten, anstatt alle Ausnahmen zu schlucken. Die Fehlermeldung wird Ihnen höchstwahrscheinlich sagen, was los ist. Die häufigsten Probleme, auf die wir gestoßen sind, hatten mit dem aktiven vs. passiven Modus und den Keepalives zu tun.

Bearbeiten:

Um herauszufinden, was wirklich vor sich ging, wenn wir FTP-Probleme mit CDNs hatten (und das passiert viel zu häufig), mussten wir manchmal Tracing in unserer Anwendung einschalten. Siehe dieser Link für Details zur Aktivierung der Ablaufverfolgung. Eine weitere Möglichkeit ist die Verwendung eines Tools wie Wireshark, um die Konversation zwischen Ihrer Anwendung und dem FTP-Server abzuhören. Wenn Sie sehen können, was im FTP-Protokoll vor sich geht, haben Sie eine viel bessere Chance, das Problem zu lösen.

0voto

t0mm13b Punkte 33393

Es könnte einen Versuch wert sein, die Open-Source-FTP-Komponente von aquí ... Ich habe versucht, FtpWebRequest zu verwenden, und meine Erfahrungen damit waren negativ ... langsam, Zeitüberschreitungen, denn natürlich funktioniert die FtpWebRequest über Port 80 statt über den nativen Port 21 ...die Situation änderte sich dramatisch, als ich diese vielseitigere und leistungsfähigere FTP-Komponente verwendete...

Bearbeiten: Als Jakob wies mich auf meinen offensichtlichen Fehler und meine unlogische Sichtweise der FtpWebRequest-Klasse hin, die mich zu der Annahme verleitete, dass irgendetwas Seltsames vor sich geht, und dass es irgendwie etwas über HTTP macht ... Nun, Jacob hat wohl Recht... ein klassischer Fall von schlechter Namenskonvention innerhalb des Frameworks... Danke Jacob!

Ich hoffe, das hilft, Mit freundlichen Grüßen, Tom.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X