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
Système.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.
au Système.Net.FtpWebRequest.CheckError()
au Système.Net.FtpWebRequest.SyncRequestCallback(Object obj)
au Système.Net.CommandStream.Abort(Exception e)
au Système.Net.FtpWebRequest.FinishRequestStage(RequestStage scène)
au Système.Net.FtpWebRequest.GetRequestStream()
au BackupDB.Programme.FTPUploadFile(String serverPath, Chaîne serverFile, FileInfo LocalFile, NetworkCredential Cred) 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();
}
OriginalL'auteur senzacionale | 2010-04-25
Vous devez vous connecter pour publier un commentaire.
omg. Qu'est-ce avec toute la condescendance ici pour acheter leur 3e partie des solutions au lieu de vous informer de changer une ligne de code?
Essayer de faire basculer le Passif de la valeur pour voir ce qui fonctionne:
Cela peut dépendre du pare-feu entre les Machines (client et serveur).
J'ai remarqué que si je passe par notre pare-feu, alors j'ai besoin d'elle à gauche au Vrai, sinon il sera de retour l'Exception:
Cependant, si je suis derrière le pare-feu (comme les deux machines se connectant directement les uns aux autres au sein d'un data-center) puis j'ai besoin de le mettre à False, sinon il sera de retour l'Exception:
Si cela fonctionne et si vous voulez faire de votre solution plus souple, vous pouvez envelopper votre demande dans un bloc try-catch à l'aide de la valeur par défaut la valeur True, et si vous obtenez l'erreur 500, puis passer UsePassive pour Faux et essayez à nouveau.
Bonjour @MartinPrikryl je suis d'accord, le problème est probablement un peu ésotérique Côté Serveur de Configuration, mais ma réponse ne servent de travail (peut-être même un hack qui j'ai l'habitude de les éviter). Le problème pour moi a été: 1.) Je ne suis pas un Ingénieur Réseau. 2.) Nous n'avons plus un Ingénieur Réseau. 3.) Même si nous n'avons, il n'y a aucune garantie qu'ils seraient de nature à altérer l'ensemble de nos serveurs de production qu'ils peuvent avoir un motif valable pour la configuration actuelle. 4.) Je voulais écrire un semi-universel Réutilisable FTP (Wrapper pour tous nos besoins) qui puisse s'occuper de ces questions avec la facilité.
OriginalL'auteur MikeTeeVee
si quelqu'un a le même problème, c'est la solution pour proftpd
http://www.proftpd.org/docs/howto/NAT.html
OriginalL'auteur senzacionale
En mode passif FTP conversation va comme suit:
On dirait que le serveur FTP avec deux adresse IP publique (par exemple, 1.2.3.4) renvoie une adresse IP privée comme une réponse à la commande PASV.
Solution
De commutation au mode Actif.
En mode actif serveur FTP se connecte au client FTP pour les transferts de données. Il permettrait de résoudre ce problème, mais n'est pas de pare-feu amical. Il ne fonctionnera pas lorsque les connexions entrantes sont bloquées (très fréquent).
Ignorant adresse IP envoyer en tant que réponse à la commande PASV
Si le serveur ftp public adresse IP est public, et de l'adresse IP renvoyée comme une réponse pour la commande PASV est privé de gamme (par exemple 10., 192.168.). Dans de tels cas, le client FTP doit utiliser l'adresse IP publique.
C'est exactement ce que fait notre Rebex FTP faire dans une telle situation. Il fonctionne bien (ce comportement peut être désactivé). Il peut même être activée sur les serveurs avec plusieurs adresses IP publiques.
Je ne sais pas si similaire à la solution de contournement est possible avec FtpWebRequest.
Vous pouvez télécharger la version d'essai et de vérifier si cela résout votre problème.
OriginalL'auteur Martin Vobr
Après beaucoup de creuser autour, j'ai trouvé le seul moyen de résoudre ce problème est de changer le PASV paramètres sur le serveur.
Heureusement, je contrôle à la fois le client et le serveur machines j'ai donc été en mesure de dire au serveur (FileZilla dans mon cas) pour utiliser l'adresse IP publique plutôt que l'IP privée.
OriginalL'auteur philwilks
Votre serveur FTP est configuré de manière incorrecte.
Dans le mode passif, le serveur de rapports d'une adresse IP et numéro de port sur lequel le client doit se connecter à un transfert de données. Votre serveur FTP les rapports de son adresse IP dans un réseau interne, même si c'est derrière un pare-feu/NAT. Le client ne peut pas se connecter à cette adresse interne pour une raison évidente. Vous devez configurer le serveur FTP pour signaler son adresse IP externe.
La façon dont cela est fait est spécifique au serveur et que vous ne nous dites pas ce que votre serveur FTP.
MasqueradeAddress
de la directive.pasv_address
de la directive.Une réponse ici vous suggérons d'utiliser le mode actif.
Mais qui peut aider que si il n'y a pas de pare-feu/NAT entre le client et le serveur, dans ce cas, vous n'aurez pas le problème à la première place (sauf si le serveur est vraiment cassé et la production de rapports complètement fausse adresse IP, non seulement à l'interne). Ou si le pare-feu est configuré pour autoriser les connexions entrantes, ce qui n'est pas habituel.
Une autre approche est d'utiliser un FTP différents bibliothèque qui peut contourner le problème en ignorant l'adresse IP incorrecte signalés par le serveur et l'utilisation de la principale/contrôle de l'adresse IP de connexion. Ou en utilisant le
EPSV
de commande au lieu dePASV
commande qui utilise implicitement le primaire/contrôle de l'adresse IP de connexion.OriginalL'auteur Martin Prikryl