2014-06-13 5 views
5

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:

enter image description here

Und hier ist die Erfassung bei der Verbindung (und nicht an) mit der App, mit passivem Satz auf true :

enter image description here

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:

enter image description here

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?

+0

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). –

+0

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

+0

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?) –

Antwort

10

Das Problem ist jetzt behoben. Es stellte sich heraus, dass es die integrierte Firewall von Kaspersky war, die die Verbindung blockierte. Es ist ärgerlich, dass es mich nicht gewarnt hat, als ich versuchte, eine Verbindung herzustellen, aber beruhigend zu wissen, dass mein PC sicher ist.

Der Hinweis im Detail der Rück 227 war:

10051 – A socket operation was attempted to an unreachable network

Auch für alle, dies über Google zu erreichen usw., wurde der Remote-Server nur konfiguriert Passive Verbindungen zulassen, weshalb ich das war immer 500 Syntaxfehler. Das Studieren einer Kabelerfassung beim Herunterladen einer Datei hat ergeben, dass Filezilla automatisch in den passiven Modus zurückkehrt, wenn Aktiv ausgewählt ist, aber fehlschlägt.

Der Code in meinem ursprünglichen Beitrag funktioniert jetzt gut.

+0

also was soll ich mit kaspersky machen? –

+0

Ich hatte das gleiche Problem, aber es war nicht Kaspersky, es war IIS 8.5. Ich musste den FTP-Dienst mit der Antwort hier neu starten, um das Problem zu beheben: http://serverfault.com/questions/309964/why-doesnt-iis-7-5-ftp-respect-the-passive-port-range- für-plain-ftp – LandonC

Verwandte Themen