Ich habe ein Problem beim Verbinden eines Windows-Dienstes mit einer FTP-Site.Der Remote-Server hat einen Fehler zurückgegeben: 227 Passiver Modus (500 oops vs_utility_recv_peek: keine Daten)
Ich habe einen Windows-Dienst von einem anderen Entwickler geerbt. Der Dienst stellt eine Verbindung zu einem Drittanbieterserver her, lädt eine CSV-Datei herunter und verarbeitet sie anschließend. Aus irgendeinem Grund hörte der Dienst auf zu arbeiten (vor gut einem Jahr, bevor ich das Projekt bekam).
Also ging ich zurück zu den Grundlagen, erstellt eine Konsole App und versuchte die Verbindung/Datei-Download-Funktion nur in dieser App. Ich habe viele verschiedene Methoden versucht, auf den FTP zu verbinden, aber alle von ihnen geben den gleichen Fehler zu meiner Anwendung:
The remote server returned an error: 227 Entering Passive Mode()
Dies ist eine der vielen Methoden, die ich versucht habe:
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://ftpaddress/filename.csv");
request.Method = WebRequestMethods.Ftp.DownloadFile;
request.Credentials = new NetworkCredential("username", "password");
request.UsePassive = true;
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
Console.WriteLine(reader.ReadToEnd());
Console.WriteLine("Download Complete, status {0}", response.StatusDescription);
reader.Close();
response.Close();
aber es fällt auf diesen Teil nach unten:
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
ich in mehreren Foren gelesen, dass die UsePassive Eigenschaft auf false behebt diese Fehler einstellen, aber alles, was mir passiert war, dass ich einen Syntaxfehler bekam stattdessen wie folgt:
The remote server returned an error: (500) Syntax error, command unrecognized.
Die Datei wird auf einem FTP-Server eines Drittanbieters gehostet, über den ich keine Kontrolle habe. Ich kann die URL in einen Browser einfügen, und ich werde aufgefordert, einen Benutzernamen und ein Passwort einzugeben, was mir dann erlaubt und ich kann die Datei herunterladen.
Um unsere Firewall als Ursache des Problems zu beseitigen, habe ich die App sowohl auf das interne Netzwerk und das WiFi (das nicht hinter der Firewall ist) ausgeführt, und es macht keinen Unterschied. Ich habe auch über FileZilla in den Modi Standard, Aktiv und Passiv verbunden und es funktionierte jedes Mal. Also kein Problem.
Also dann lief ich Wireshark. Hier ist ein Bild des Drahtes Capture mit Filezilla (dh einem erfolgreichen), im passiven Modus:
Und hier ist die Erfassung bei der Verbindung (und nicht an) mit der App, mit passivem Satz auf true :
so wie Sie oben in der ausgefallenen Verbindung sehen können, kann ich prima, nur auf den Server anmelden. Aus irgendeinem Grund wird dann eine zusätzliche Anforderung gesendet, nämlich "TYPE I", die die Antwort von "Umschalten in den binären Modus" auslöst. Die darunter, erhalte ich die folgende:
500 oops: vsf_sysutil_recv_peek: no data
Darüber hinaus habe ich lief es auch wieder nach dem Passiv Eigenschaft auf false setzen, und das ist, was ich damals bekam:
Also meine Frage ist zweifach;
1, wenn ich irgendwie über das UsePassive-Problem hinaus komme und diese Eigenschaft auf false setze, löst das dann mein Problem?
2, ignoriert die UsePassive-Eigenschaft, warum kann ich die Datei nicht von der App herunterladen, aber kann von überall sonst?
Ja, wenn Sie UsePassive = false verwenden, sollte es anyayx 2xx Codes ** verschwinden ** sind keine Fehler **, also denke ich, es ist ein Fehler in .NET-Code (Fehler ist etwas anderes, aber es meldet zuletzt ausgeführte Operation). –
Danke für die Antwort. Ich weiß, dass der 227 kein Fehlercode ist, also nehme ich an, dass die .NET-Anwendung das zurückgibt, da es die letzte erfolgreiche Antwort vom Server war. Mein .net Code ist oben. Springt dir etwas als falsch? Ich habe heute viele verschiedene Methoden ausprobiert, aber alle machen das Gleiche. – odinel
Nein, nichts scheint falsch zu sein (aber ich würde versuchen, request.UseBinary = true hinzuzufügen, sowohl mit als auch ohne UsePassive). Es scheint ein Serverfehler (oder ein Clientfehler wegen der Firewall beim Versuch, TCP-Verbindung herzustellen?) –