Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
FTP Verbindung offen halten und weiterverwenden
nwb86
myCSharp.de - Member



Dabei seit:
Beiträge: 4

Themenstarter:

FTP Verbindung offen halten und weiterverwenden

beantworten | zitieren | melden

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.
Fehler
Fehler beim Empfangen des RequestStreams
Inhaltsteil mit diesem Verbtyp kann nicht gesendet werden.

Viele Grüße und Danke

nwb86
private Nachricht | Beiträge des Benutzers
unclesam
myCSharp.de - Member



Dabei seit:
Beiträge: 237
Herkunft: Nassau

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
nwb86
myCSharp.de - Member



Dabei seit:
Beiträge: 4

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
norman_timo
myCSharp.de - Member

Avatar #avatar-1775.jpeg


Dabei seit:
Beiträge: 4.506
Herkunft: Wald-Michelbach (Odw)

beantworten | zitieren | melden

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!”
private Nachricht | Beiträge des Benutzers
mosspower
myCSharp.de - Member

Avatar #avatar-2662.jpg


Dabei seit:
Beiträge: 456
Herkunft: Bamberg

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
norman_timo
myCSharp.de - Member

Avatar #avatar-1775.jpeg


Dabei seit:
Beiträge: 4.506
Herkunft: Wald-Michelbach (Odw)

beantworten | zitieren | melden

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!”
private Nachricht | Beiträge des Benutzers
tom-essen
myCSharp.de - Experte

Avatar #avatar-2140.png


Dabei seit:
Beiträge: 1.815
Herkunft: NRW

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
moson
myCSharp.de - Member

Avatar #avatar-7.jpg


Dabei seit:
Beiträge: 151

beantworten | zitieren | melden

Um eine Verbindung aufrecht zu erhalten ist der "NOOP" Befehl da.
private Nachricht | Beiträge des Benutzers
tom-essen
myCSharp.de - Experte

Avatar #avatar-2140.png


Dabei seit:
Beiträge: 1.815
Herkunft: NRW

beantworten | zitieren | melden

Hallo!

@moson:
Stimmt, und es steht sogar im FTP-RFC.
Nobody is perfect. I'm sad, i'm not nobody
private Nachricht | Beiträge des Benutzers