Laden...

FTP Verbindung offen halten und weiterverwenden

Erstellt von nwb86 vor 15 Jahren Letzter Beitrag vor 14 Jahren 8.127 Views
N
nwb86 Themenstarter:in
4 Beiträge seit 2008
vor 15 Jahren
FTP Verbindung offen halten und weiterverwenden

Hallo,

ich lade über die FTP Verbindung Dateien auf den FTP Server. Da ich mehrere Dateien nacheinander hochladen möchte, würde ich das FTP-Requestobject gerne weiterverwenden und nicht immer wieder die FTP Verbindung schließen und neu öffnen.
Nur wie weise ich dem FTPRequestobject die neue Uploadurl zu ohne die Verbindung neu zu starten?
Bis jetzt kam immer: "Fehler 503 - falsche Befehlsreihenfolge -> Sie sind schon eingeloggt"
Mein bisheriger Code:

        
class { ...
        String ftpServerIP;
        String ftpUserID;
        String ftpPassword;
        String uri = "";
        ThreadSafe _thSet;
        ResourceManager rm;
        FtpWebRequest reqFTP;

//Konstruktor
public FTP(String server, string user, string pw, String dicPictures, ResourceManager rm) {
            Debug.WriteLine("***** [FTP] *****");
            ftpServerIP = server;
            ftpUserID = user;
            ftpPassword = pw;
            uri = "ftp://" + ftpServerIP + "/" + dicPictures + "/";
            this.rm = rm;
            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
            // Provide the WebPermission Credintials
            reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
            reqFTP.KeepAlive = true;
            reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
            reqFTP.Timeout = System.Threading.Timeout.Infinite;
            reqFTP.Proxy = null;
            // Specify the data transfer type.
            reqFTP.UseBinary = true;
            reqFTP.UsePassive = true;
            reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
        }

        // Uploadmethode
        public bool Upload(string filename, String folderName, ProgressBar prgBar, Label lblStat) {

            FileInfo fileInf = new FileInfo(filename);          
            Stream requStream = null;
            FtpWebResponse resp = null;
            // Create FtpWebRequest object from the Uri provided
            try {
                requStream = reqFTP.GetRequestStream();
            }
            catch (Exception ex) {
                Debug.WriteLine("[ERROR] Fehler beim Empfangen des RequestStreams \n" + ex.Message + "\n" + ex.StackTrace);
                return false;
                throw;
            }

            FileStream fs = null;

            try {
                byte[] buff = new byte[2048];
                int bytesRead = 0;
                int actSize = 0;
                long fileSize = fileInf.Length;
                fs = File.OpenRead(filename);
                while (true) {
                    bytesRead = fs.Read(buff, 0, buff.Length);
                    if (bytesRead == 0) {
                        break;
                    }
                    requStream.Write(buff, 0, bytesRead);
                }
                requStream.Close();
                resp = (FtpWebResponse)reqFTP.GetResponse();
                Debug.WriteLine("[INFO] FTP Upload erfolgreich");
                return true;
            }
            catch (Exception ex) {
                MessageBox.Show(rm.GetString("FTPErrorUpload") + ex.Message);
                Debug.WriteLine("[ERROR] FTP Upload fehlgeschlagen\n" + ex.Message + "\n" + ex.StackTrace);
                return false;
            }
            finally {
                Debug.WriteLine("[INFO] Beenden resp; requStream, fs");
                if (resp != null) resp.Close();
                if (requStream != null) requStream.Close();
                if (fs != null) fs.Close();
            }
        }

Aufruf im Programm:

FTP ftp = new FTP(userConfig.urlFTPServer, userConfig.usernameFTP, userConfig.passwordFTP, userConfig.dicPictures, rm);

foreach (string uploadImg in FileNames) {
   ftp.Upload(uploadImg, tbxNameAlbum.Text, prgUploadFile, lblTextStatFile);
}

Leider verursacht dieser Code folgenden Fehler:
Eine Ausnahme (erste Chance) des Typs "System.Net.ProtocolViolationException" ist in System.dll aufgetreten.> Fehlermeldung:

Fehler beim Empfangen des RequestStreams
Inhaltsteil mit diesem Verbtyp kann nicht gesendet werden.

Viele Grüße und Danke

nwb86

U
237 Beiträge seit 2007
vor 15 Jahren

hast du dein problem schon lösen können? wäre für eine lösung dankbar.

heute code ich, morgen debug ich und übermorgen cast ich die königin auf int

N
nwb86 Themenstarter:in
4 Beiträge seit 2008
vor 15 Jahren

Hey unclesam,

leider nicht. Habe ständig eine neue Session aufgemacht. Wenn du doch noch ne Lösung finden solltest - bitte Bescheid sagen,

Viele Grüße

4.506 Beiträge seit 2004
vor 15 Jahren

Hallo zusammen,

die übergebene URI definiert quasi den FTP Server, mit dem sich bei der Ausführung verbunden werden soll. Man kann hier auch einen Einstiegspfad wählen, in das automatisch gewechselt werden soll.

Eine Verzeichnisänderung hat praktisch nichts mit einer URI zu tun, es soll ja immer noch der gleiche FTP Server verwendet werden.

Hier bietet die FtpWebRequest leider nur sehr wnige Hilfmittel, aber wenn ich das nun in der Hilfe richtig gelesen habe, das Allerheilmittel MSDN - FtpWebRequest.Method Eigenschaft in dem man (wenn ich das richtig interpretiere) eigene FTP Befehle absenden kann.

Probiert doch einfach mal den Befehl "cd [Verz.]" ([Verz] = Angabe des Verzeichnisses in das gewechselt werden soll in relativer Schreibweise zum aktuellen Verzeichnis).

Eventuell funktioniert das.

Ansonsten kann ich nur zu anderen FTP Helferklassen verweisen, da das .NET Framework hier keine wirklich komfortablen FTP Klassen zur Verfügung stellt (leider).

Grüße
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

456 Beiträge seit 2007
vor 15 Jahren

Ich scheitere gerade auch aktuell an der gleichen Problematik. Gibt es wirklich keine Möglichkeit, die Verbindung zu halten. Es kann doch nicht sein, dass wenn ich z.B. 20 Dateien downloaden möchte, dass ich dann 20 mal einen neuen Request schicke und mich dann vorher auch noch authentifizieren muss.

Gruß und danke schon einmal für etwaige Antworten im Voraus.

4.506 Beiträge seit 2004
vor 15 Jahren

Hallo mosspower,

nimm doch einfach mal ein FTP Client Programm, das die FTP Befehle in einem Ausgabefenster mit ausgibt.

Du wirst überrascht sein, wie oft ein neuer Request gesendet wird. Jeder Verzeichniswechsel, jede Dateiinformation etc. ist ein Request/Response.

Authentifizierung fordert der Server an, es liegt auch in seiner Hoheit wie lange und unter welchen Kriterien er diese speichert. Er sollte wohl das RFC befolgen, darin sind auch Grundlagen definiert.

In aller Regel wird die Kommunikation normalerweise so aussehen (sinngemäß):

  • Hallo
  • Authentifizierung
  • Verzeichniswechsel/Verzeicnisauskunft/Dateidownload
  • ...
  • Bye

Jeder Punkt ist auch ein Request/Response. Aber die Authentifizierung sollte sich der FTP Server merken können.

Ich habe nun aber keine Ahnung, warum das FtpWebRequest nun so unkomfortabel mit einem Verzeichniswechsel (wenn überhaupt möglich) umgeht.

Grüße
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

1.820 Beiträge seit 2005
vor 14 Jahren

Hallo!

Kleiner Tipp als Nachtrag:
Um eine FTP-Verbindung offen zu halten, kann man einfach in bestimmten Abständen ein "PWD" senden (Print Working Directory). Das hat bei mir bisher geklappt.

Nobody is perfect. I'm sad, i'm not nobody 🙁

151 Beiträge seit 2003
vor 14 Jahren

Um eine Verbindung aufrecht zu erhalten ist der "NOOP" Befehl da.

1.820 Beiträge seit 2005
vor 14 Jahren

Hallo!

@moson:
Stimmt, und es steht sogar im FTP-RFC.

Nobody is perfect. I'm sad, i'm not nobody 🙁