Server zurück eine Adresse in Reaktion auf den Befehl, den PASV anders als die Adresse ist, auf denen die FTP-Verbindung hergestellt wurde

StackOverflow https://stackoverflow.com/questions/2709498

Frage

System.Net.WebException: Der Server lieferte eine Adresse in Reaktion auf den PASV-Befehl, der als die Adresse unterscheidet, auf denen die FTP-Verbindung hergestellt wurde
. bei System.Net.FtpWebRequest.CheckError ()
bei System.Net.FtpWebRequest.SyncRequestCallback (Object obj)
bei System.Net.CommandStream.Abort (Exception e)
bei System.Net.FtpWebRequest.FinishRequestStage (RequestStag Stufe)
bei System.Net.FtpWebRequest.GetRequestStream ()
bei BackupDB.Program.FTPUploadFile (String ServerPath, String serverFile, Fileinfo Localfile, NetworkCredential Cred) in D: \ PROJEKTI \ BackupDB \ BackupDB \ Program.cs: Leitung 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();
}
War es hilfreich?

Lösung 2

, wenn jemand das gleiche Problem hat, ist diese Lösung für proftpd

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

Andere Tipps

omg. Was mit allen liegt die Anbiederung hier für ihre 3rd-Party-Lösungen zu kaufen, anstatt, Ihnen mitzuteilen, eine Zeile Code zu ändern?

Versuchen Sie, den Passive Wert Makel zu sehen, welche funktioniert:

    request.UsePassive = false;

Das auf der Firewall zwischen den Maschinen (Client und Server) abhängen kann.

Ich habe bemerkt, wenn ich durch unseren Firewall gehen, dann muß ich es bei True links, sonst wird es die Ausnahme zurück:

Der Remoteserver hat einen Fehler zurückgegeben: (500) Syntaxfehler, Befehl unerkannt.

Allerdings, wenn ich hinter der Firewall (wie zwei Maschinen verbinden direkt miteinander in einem Datenzentrum) bin dann muß ich es auf False setzen, sonst wird die Ausnahme zurück:

Der Server lieferte eine Adresse in Reaktion auf den Befehl, den PASV als die Adresse verschieden ist, auf denen die FTP-Verbindung war gemacht.

Wenn das funktioniert, und Sie möchten Ihre Lösung anpassungsfähiger machen, könnten Sie Ihre Anfrage in einem Try-Catch-Block wickeln Sie den Standard-Wert True verwenden, und wenn Sie die 500-Fehler erhalten, wechseln dann UsePassive auf False und versuchen Sie es erneut .

Im passiven FTP-Modus Gespräch geht wie folgt vor:

client: PASV
(i would like to transfer files. Tell me which port and ip address should I use)

server: 227 Entering Passive Mode (172,16,3,4,204,173)
(ok, use port 52397 on IP address 172.16.3.4.)

client: connects to this IP address/port and starts data transfer.

Es sieht aus wie der FTP-Server mit zwei öffentlichen IP-Adresse (zum Beispiel 1.2.3.4) gibt eine private IP-Adresse als Antwort auf PASV Befehl.

Lösung

Umschalten auf Aktiv-Modus.

Im aktiven Modus FTP-Server eine Verbindung zu FTP-Client für Datenübertragungen. Es wäre dieses Problem zu lösen, ist aber nicht Firewall-freundlich. Es wird nicht funktionieren, wenn eingehende Verbindungen gesperrt sind (sehr häufig).

Das Ignorieren IP-Adresse senden als Reaktion auf PASV Befehl

Wenn die öffentlichen FTP-Server IP-Adresse ist eine öffentlicher und IP-Adresse als Antwort für PASV Befehl zurückgegeben wird, ist aus privatem Bereich (zB 10, 192,168.). In einem solchen Fall sollte der FTP-Client die öffentliche IP-Adresse verwenden.

Das ist genau das, was tut unsere Rebex FTP tun in einer solchen Situation. Es funktioniert gut (dieses Verhalten kann abgeschaltet werden). Es kann sogar auf für Server mit mehreren öffentlichen IP-Adressen umgewandelt werden.

Ich weiß nicht, ob ähnliche Abhilfe ist möglich mit FtpWebRequest.

Sie können Download Trial und prüfen, ob es Ihr Problem löst .

Nach viel Graben um mich den einzigen Weg gefunden, dieses Problem zu lösen, war die PASV Einstellungen auf dem Server zu ändern.

Zum Glück steuere ich sowohl die Client- und Server-Maschinen, so ich in der Lage war, der Server (in meinem Fall FileZilla) zu sagen, eher die öffentliche IP zu verwenden, als die private IP.

Ihr FTP-Server ist falsch konfiguriert.

Im passiven Modus meldet der Server eine IP-Adresse und Port, an dem der Kunde für eine Datenübertragung verbinden soll. Ihr FTP-Server meldet seine IP-Adresse in einem internen Netzwerk, obwohl es hinter einer Firewall / NAT ist. Der Kunde kann sich nicht auf diese interne Adresse aus offensichtlichen Grund verbinden. Sie müssen den FTP-Server konfigurieren, dass seine externe IP-Adresse zu melden.

Wie das getan ist serverspezifisch und Du hast uns nicht gesagt, was Ihr FTP-Server ist.


Einige Antwort hier vorschlagen, den aktiven Modus.

request.UsePassive = false;

Aber das kann helfen, nur wenn es keine Firewall / NAT zwischen dem Client und dem Server, in dem Fall, dass Sie nicht das Problem in erster Linie haben (es sei denn, der Server wirklich gebrochen ist und meldet eine völlig falsche IP-Adresse, nicht nur die interne eins). Oder, wenn der Firewall / NAT konfiguriert ist, eingehende Verbindungen zu ermöglichen, was nicht üblich ist.


Ein weiterer Ansatz ist, mit einer anderen FTP-Bibliothek, die das Problem der falsche IP umgehen kann vom Server und mit Hilfe der primären / Steueranschluss IP-Adresse gemeldet Adresse ignoriert. Oder durch den EPSV Befehl statt PASV Befehl, dass implizit verwendet die primären / Steueranschluss IP-Adresse.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top