Server zurück eine Adresse in Reaktion auf den Befehl, den PASV anders als die Adresse ist, auf denen die FTP-Verbindung hergestellt wurde
-
01-10-2019 - |
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();
}
Lösung 2
, wenn jemand das gleiche Problem hat, ist diese Lösung für proftpd
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.
- IIS: In IIS-Manager , öffnen Sie FTP> FTP-Firewall-Unterstützung . Siehe Abschnitt Server hinter externer Firewall / NAT in meinem Führer auf IIS-Server Installation
- FileZilla FTP-Server: Zum Bearbeiten> Einstellungen> Passiv-Modus-Einstellungen> IPv4-spezifische> Externen Server-IP-Adresse für die passiven Modus-Übertragungen . Siehe FTP-Server läuft auf Port 2000 über NAT nicht funktioniert auf dem Passiv-Modus .
- ProFTPD. Verwenden Sie
MasqueradeAddress
Richtlinie - vsftpd.
pasv_address
Richtlinie
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.