Le serveur a renvoyé une adresse en réponse à la commande PASV qui est différente de l'adresse à laquelle la connexion a été faite FTP

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

Question

  

System.Net.WebException: Le serveur a renvoyé une adresse en réponse à la commande PASV qui est différente de l'adresse à laquelle la connexion FTP a été faite
.      à System.Net.FtpWebRequest.CheckError ()
     à System.Net.FtpWebRequest.SyncRequestCallback (Object obj)
     à System.Net.CommandStream.Abort (Exception e)
     à System.Net.FtpWebRequest.FinishRequestStage (stade de RequestStage)
     à System.Net.FtpWebRequest.GetRequestStream ()
     à BackupDB.Program.FTPUploadFile (String ServerPath, String serverFile, FileInfo FichierLocal, NetworkCredential CRED) en D: \ PROJEKTI \ BackupDB \ BackupDB \ Program.cs: ligne 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();
}
Était-ce utile?

La solution 2

si quelqu'un a le même problème, c'est la solution pour proftpd

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

Autres conseils

omg. Quoi de neuf avec tout le proxénétisme ici pour acheter leurs solutions 3ème partie au lieu de vous informer pour changer une ligne de code?

Essayez la valeur passif basculer pour voir ce qui fonctionne:

    request.UsePassive = false;

Cela peut dépendre du pare-feu entre les machines (client et serveur).

Je l'ai remarqué si je passe par notre pare-feu, puis je en ai besoin laissé à vrai, sinon elle retournera l'exception:

  

Le serveur distant a renvoyé une erreur: (500) Erreur de syntaxe, commande   non reconnu.

Cependant, si je suis derrière le pare-feu (comme deux machines se connectant directement à l'autre dans un centre de données), alors je dois le mettre sur False, sinon elle retournera l'exception:

  

Le serveur a renvoyé une adresse en réponse à la commande PASV qui est différente de l'adresse à laquelle la connexion FTP était   fait.

Si cela fonctionne et que vous voulez rendre votre solution plus adaptable, vous pouvez envelopper votre demande dans un bloc try-catch en utilisant la valeur par défaut est vrai, et si vous obtenez l'erreur 500, puis passer UsePassive False et essayer à nouveau .

Dans la conversation FTP en mode passif se présente comme suit:

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.

Il semble que le serveur FTP avec deux adresses IP publique (par exemple 1.2.3.4) renvoie une adresse IP privée en réponse à la commande PASV.

Solution

Passage en mode actif.

Dans Connects serveur FTP en mode actif à client FTP pour les transferts de données. Cela réglerait cette question, mais pas les pare-feux. Il ne fonctionnera pas si les connexions entrantes sont bloquées (très fréquent).

Ignorer envoyer l'adresse IP comme réponse à la commande PASV

Si l'adresse IP du serveur FTP public est public, et l'adresse IP renvoyée en réponse pour la commande PASV est de la gamme privée (par exemple 10., 192,168.). Dans ce cas, le client FTP doit utiliser l'adresse IP publique.

Ceci est exactement ce que notre Rebex FTP faire dans une telle situation. Il fonctionne bien (ce comportement peut être désactivé). Il peut même être activé pour les serveurs avec plusieurs adresses IP publiques.

Je ne sais pas si solution similaire est possible avec FtpWebRequest.

Vous pouvez essai de téléchargement et vérifier si cela résout votre problème .

Après beaucoup de creuser autour, j'ai trouvé la seule façon de résoudre ce problème est de changer les paramètres de PASV sur le serveur.

Heureusement, je contrôle les deux machines client et serveur donc j'ai pu dire au serveur (FileZilla dans mon cas) d'utiliser l'adresse IP publique plutôt que l'adresse IP privée.

Votre serveur FTP est mal configuré.

Dans le mode passif du serveur signale une adresse IP et le port auquel le client doit se connecter à un transfert de données. Votre serveur FTP signale son adresse IP dans un réseau interne, bien qu'il se cache derrière un pare-feu / NAT. Le client ne peut pas se connecter à cette adresse interne pour des raisons évidentes. Vous devez configurer le serveur FTP pour signaler son adresse IP externe.

Comment cela se fait est spécifique au serveur et vous ne nous dit pas, ce que votre serveur FTP est.


Certaines réponses ici suggèrent d'utiliser le mode actif.

request.UsePassive = false;

Mais cette aide peut que s'il n'y a pas de pare-feu / NAT entre le client et le serveur, auquel cas vous n'aurez pas le problème en premier lieu (à moins que le serveur est vraiment cassé et fait état d'une adresse IP complètement faux, non seulement l'interne). Ou si le pare-feu / NAT est configuré pour autoriser les connexions entrantes, ce qui est pas habituel.


Une autre approche utilise une bibliothèque FTP différent qui peut contourner le problème en ignorant l'adresse IP incorrecte signalée par le serveur et en utilisant l'adresse IP de connexion de contrôle primaire /. Ou en utilisant la commande EPSV au lieu de commande PASV qui utilise implicitement l'adresse IP de connexion primaire / contrôle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top