2010-02-16 3 views
5

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 bekomme ich Probleme. Ich verwende ein Stream-Objekt und habe festgestellt, dass mein Code beim Schließen des Streams hängen bleibt (nur bei großen Dateien). Der Code läuft gut, wenn ich den Stream nicht schließe (selbst für große Dateien). Sieht jemand Logik darin, warum dies geschieht? Und wenn ich den Stream nicht schließe, könnte es in Zukunft zu Problemen kommen.FTP-Upload mit .NET

-Code-Extrakt:

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

Der Code reagiert nicht mehr (wenn die Upload-Datei groß ist) an:

strm.Close(); 

Es gibt keine Ausnahme, da dieser Teil innerhalb Try-Catch ist.

Ich weiß nicht, wie man eine Stack-Trace bekommen.

+1

Wie verwenden Sie die FtWebRequest-Klasse?Haben Sie Probleme mit allen FTP-Servern oder nur dem einen? –

+1

Was meinst du mit "am Ende in Problem". Könnten Sie einen bestimmten Stack-Trace oder falsches Verhalten veröffentlichen? – abc

+0

Entschuldigung, wenn jemand meine Frage bearbeitet hat, kannst du das bitte nochmal machen. – kobra

Antwort

6

Ich weiß nicht genau, welchen Fehler Sie beim Schließen des Streams bekommen, aber in unserer Anwendung machen wir viele große Datei-Uploads (Videos und Bilder). Hier ist, wie wir zu unserem 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 ein using Block tut wirksam den Close Anruf auf seinem eigenen tun würde, aber vielleicht ist es führt auch andere notwendige Bereinigung. Beachten Sie auch, dass ich die FTP-Keepalives deaktiviert habe, was uns auf einigen der FTP-Sites von Drittanbietern, auf die wir hochgeladen haben, Probleme verursacht hat.

Sie sollten sich wirklich die spezielle Ausnahme ansehen, die Sie erhalten, anstatt alle Ausnahmen zu verschlingen. Die Fehlermeldung wird höchstwahrscheinlich Ihnen sagen, was falsch ist. Die häufigsten Probleme, mit denen wir zu tun hatten, betrafen den Aktiv-Passiv-Modus und die Keepalives.

Edit:

Um herauszufinden, was wirklich los war, wenn wir FTP Probleme mit CDNs hatte (und es passiert viel zu oft), hatten wir manchmal drehen in unserer Anwendung Verfolgung auf. Details zum Aktivieren der Ablaufverfolgung finden Sie unter this link. Eine andere Möglichkeit besteht darin, ein Tool wie Wireshark zu verwenden, um die Konversation zwischen Ihrer Anwendung und dem FTP-Server zu erkennen. Wenn Sie sehen können, was im FTP-Protokoll vor sich geht, haben Sie eine viel größere Chance, das Problem zu lösen.

+0

Danke. In meinem Code KeepAlive ist falsch und ich habe versucht "zu verwenden", aber der Code kommt nie aus "Verwendung" -Block. Was Fehler betrifft, bekomme ich keine Ausnahme, was es schwierig macht, das Problem zu verfolgen. – kobra

+0

Verwenden Sie den aktiven oder passiven Modus? – Jacob

+0

Und wenn Sie sagen: "Es gibt keine Ausnahme, da dieser Teil innerhalb von try-catch ist", sagen Sie, dass der catch-Block nicht erreicht wird oder dass try/catch Ihre Ausnahme maskiert? – Jacob

0

Es könnte einen Versuch wert sein, die Open-Source-FTP-Komponente aus here auszuprobieren ... Ich habe versucht, mit FtpWebRequest und meine Erfahrung der Verwendung war negativ ... langsam, mal out, weil ganz natürlich, die FtpWebRequest arbeitet über Port 80 statt der nativen Port 21 ... die Situation dramatisch verändert, als ich diese FTP-Komponente verwendet, vielseitige und leistungsfähige ...

Edit: Als Jacob wies darauf hin, mein offensichtlicher Fehler und meine unlogische Sicht auf die FtpWebRequest-Klasse, die mich dazu brachte, etwas zu glauben funky und komisch ging weiter, und dass es irgendwie etwas über HTTP machte ... Nun, Jacob muss einen Punkt haben ... ein klassischer Fall von schlechten Namenskonventionen innerhalb des Frameworks ... Danke Jacob!

Hoffen, dass dies hilft, Mit freundlichen Grüßen, Tom.

+0

FtpWebRequest hat Port 80 nie für uns verwendet. Woher bekommst du diese Informationen? – Jacob

+0

@Jacob: Warum heißt es FtpWebRequest ... es verwendet das HTTP-Protokoll, um mit einem FTP-Server zu kommunizieren ... das Schlüsselwort ist im Namen !! Warum WebRequest verwenden, um ein FtpWebRequest zu erstellen? Wenn Sie anderer Meinung sind ... Warum gibt es keine dedizierte FTP-Komponente, um direkt mit Port 21 zu kommunizieren? Es ist um diese WebRequest-Klasse gewickelt ... – t0mm13b

+2

Es ist nur ein schlechter Name. HttpWebRequest verwendet Port 80 und FtpWebRequest Port 21. WebRequest ist die abstrakte Basisklasse für beide. – Jacob