5 Stimmen

Der Server hat eine Adresse als Antwort auf das PASV-Kommando zurückgegeben, die von der Adresse abweicht, zu der die FTP-Verbindung hergestellt wurde.

System.Net.WebException: Der Server hat eine Adresse als Antwort auf das PASV-Kommando zurückgegeben, die von der Adresse abweicht, zu der die FTP-Verbindung hergestellt wurde.
at System.Net.FtpWebRequest.CheckError()
at System.Net.FtpWebRequest.SyncRequestCallback(Object obj)
at System.Net.CommandStream.Abort(Exception e)
at System.Net.FtpWebRequest.FinishRequestStage(RequestStage stage)
at System.Net.FtpWebRequest.GetRequestStream()
at BackupDB.Program.FTPUploadFile(String serverPath, String serverFile, FileInfo LocalFile, NetworkCredential Cred) in D:\PROJEKTI\BackupDB\BackupDB\Program.cs:line 119

code:

FTPMakeDir(new Uri(serverPath + "/"), Cred);
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverPath+serverFile);
request.UsePassive = true;
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = Cred;
byte[] buffer = new byte[10240];    // Read/write 10kb

using (FileStream sourceStream = new FileStream(
    LocalFile.ToString(), FileMode.Open))
{
    using (Stream requestStream = request.GetRequestStream())
    {
        int bytesRead;
        do
        {
            bytesRead = sourceStream.Read(buffer, 0, buffer.Length);
            requestStream.Write(buffer, 0, bytesRead);
        } while (bytesRead > 0);
    }
    response = (FtpWebResponse)request.GetResponse();
    response.Close();
}

8voto

MikeTeeVee Punkte 17130

Omg. Was ist hier los mit all dem Anbiedern zum Kauf ihrer Lösungen von Drittanbietern, anstatt Sie darüber zu informieren, eine Zeile Code zu ändern?

Versuchen Sie, den Wert Passive umzuschalten, um zu sehen, was funktioniert:

    request.UsePassive = false;

Dies kann vom Firewall zwischen den Maschinen abhängen (Client und Server).

Ich habe festgestellt, dass, wenn ich über unseren Firewall gehe, ich es auf True belassen muss, sonst wird die Ausnahme zurückgegeben:

Der entfernte Server hat einen Fehler zurückgegeben: (500) Syntaxfehler, Befehl nicht erkannt.

Wenn ich jedoch hinter der Firewall bin (wie zwei Maschinen, die direkt miteinander in einem Rechenzentrum verbunden sind), dann muss ich es auf False setzen, sonst wird die Ausnahme zurückgegeben:

Der Server hat eine Adresse als Antwort auf den PASV-Befehl zurückgegeben, die sich von der Adresse unterscheidet, mit der die FTP-Verbindung hergestellt wurde.

Wenn dies funktioniert und Sie Ihre Lösung anpassungsfähiger machen möchten, könnten Sie Ihren Request in einen Try-Catch-Block einwickeln, der den Standardwert True verwendet, und wenn Sie den 500-Fehler erhalten, schalten Sie UsePassive auf False um und versuchen es erneut.

3voto

senzacionale Punkte 19912

Wenn jemand das gleiche Problem hat, hier ist die Lösung für proftpd

http://www.proftpd.org/docs/howto/NAT.html

3voto

Martin Vobr Punkte 5673

Im passiven Modus läuft das FTP-Gespräch wie folgt ab:

client: PASV
(ich möchte Dateien übertragen. Sagen Sie mir, welchen Port und IP-Adresse soll ich verwenden)

server: 227 Entering Passive Mode (172,16,3,4,204,173)
(ok, verwenden Sie Port 52397 auf der IP-Adresse 172.16.3.4.)

client: verbindet sich mit dieser IP-Adresse/diesem Port und startet den Datentransfer.

Es scheint, dass der FTP-Server mit zwei öffentlichen IP-Adressen (z. B. 1.2.3.4) eine private IP-Adresse als Antwort auf den PASV-Befehl zurückgibt.

Lösung

Wechseln in den aktiven Modus.

Im aktiven Modus verbindet sich der FTP-Server mit dem FTP-Client für Datenübertragungen. Dies würde das Problem lösen, ist jedoch nicht firewall-freundlich. Es funktioniert nicht, wenn eingehende Verbindungen blockiert sind (sehr häufig).

Ignorieren der als Antwort auf den PASV-Befehl gesendeten IP-Adresse

Wenn die öffentliche IP-Adresse des FTP-Servers eine öffentliche ist und die als Antwort auf den PASV-Befehl zurückgegebene IP-Adresse aus dem privaten Bereich stammt (zum Beispiel 10., 192.168.). In diesem Fall sollte der FTP-Client die öffentliche IP-Adresse verwenden.

Genau das macht unser Rebex FTP in solchen Situationen. Es funktioniert gut (dieses Verhalten kann deaktiviert werden). Es kann sogar für Server mit mehreren öffentlichen IP-Adressen aktiviert werden.

Ich weiß nicht, ob ein ähnlicher Workaround mit FtpWebRequest möglich ist.

Sie können eine Testversion herunterladen und überprüfen, ob dies Ihr Problem löst.

2voto

philwilks Punkte 659

Nach viel Recherche fand ich heraus, dass der einzige Weg, um dieses Problem zu lösen, darin bestand, die PASV-Einstellungen auf dem Server zu ändern.

Glücklicherweise kontrolliere ich sowohl die Client- als auch die Server-Maschinen, sodass ich dem Server (in meinem Fall FileZilla) mitteilen konnte, die öffentliche IP anstelle der privaten IP zu verwenden.

2voto

Martin Prikryl Punkte 164336

Ihr FTP-Server ist falsch konfiguriert.

Im passiven Modus meldet der Server eine IP-Adresse und einen Port, mit denen der Client für einen Datenübertragung verbunden werden soll. Ihr FTP-Server meldet seine IP-Adresse innerhalb eines internen Netzwerks, obwohl er hinter einer Firewall/NAT ist. Der Client kann sich aus offensichtlichen Gründen nicht mit dieser internen Adresse verbinden. Sie müssen den FTP-Server konfigurieren, damit er seine externe IP-Adresse meldet.

Wie das gemacht wird, ist serverspezifisch und Sie haben uns nicht mitgeteilt, welchen FTP-Server Sie verwenden.


Einige Antworten hier empfehlen die Verwendung des aktiven Modus.

request.UsePassive = false;

Aber das kann nur helfen, wenn es keine Firewall/NAT zwischen dem Client und dem Server gibt, in diesem Fall hätten Sie das Problem erst gar nicht (es sei denn, der Server ist wirklich defekt und meldet eine völlig falsche IP-Adresse, nicht nur die interne Adresse). Oder wenn die Firewall/NAT des Clients so konfiguriert ist, dass eingehende Verbindungen erlaubt sind, was unüblich ist.


Ein anderer Ansatz besteht darin, eine andere FTP-Bibliothek zu verwenden, die das Problem umgehen kann, indem sie die falsche IP-Adresse, die vom Server gemeldet wird, ignoriert und stattdessen die primäre/Steuerungsverbindungs-IP-Adresse verwendet. Oder indem der EPSV Befehl anstelle des PASV Befehls verwendet wird, der implizit die primäre/Steuerungsverbindungs-IP-Adresse verwendet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X