2009-05-18 6 views
9

Je continue de recevoir une exception lorsque j'essaie de transférer vers FTP mon serveur Win 2008 à partir du code C# en utilisant VS2008 comme débogueur.Définir le numéro de port lors de l'utilisation de FtpWebRequest en C#

Ma classe de test ressemble à ceci:

public class FTP 
{ 
    private string ftpServerIP = "192.168.10.35:21"; 
    private string ftpUserID = "Administrator"; 
    private string ftpPassword = "XXXXXXXX"; 
    private string uploadToFolder = "uploadtest"; 

    public void Upload(string filename) 
    { 
     FileInfo fileInf = new FileInfo(filename); 
     string uri = "ftp://" + ftpServerIP + "/" + uploadToFolder + "/" + fileInf.Name; 
     FtpWebRequest reqFTP; 

     reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); 
     reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); 
     reqFTP.KeepAlive = false; 
     reqFTP.Method = WebRequestMethods.Ftp.UploadFile; 
     reqFTP.UseBinary = true; 
     reqFTP.ContentLength = fileInf.Length; 

     int buffLength = 2048; 
     byte[] buff = new byte[buffLength]; 
     int contentLen; 

     FileStream fs = fileInf.OpenRead(); 
     try 
     { 
      Stream strm = reqFTP.GetRequestStream(); 
      contentLen = fs.Read(buff, 0, buffLength); 

      while (contentLen != 0) 
      { 
       strm.Write(buff, 0, contentLen); 
       contentLen = fs.Read(buff, 0, buffLength); 
      } 

      strm.Close(); 
      fs.Close(); 
     } 
     catch (Exception ex) 
     { 
      throw new Exception(ex.Message); 
     } 
    } 
} 

Lorsque j'exécute le code que je reçois une connexion échoué avec l'erreur FTP 227 dans l'appel GetRequestStream(). À l'exception, je peux voir la connexion ne parvient pas à: 192.168.10.35:52184

Je ne sais pas comment il se fait avec le port 52184. je précise dans le ftpServerIP qu'il devrait être le port 21.

J'ai trouvé quelques personnes avec les mêmes problèmes sur google mais je n'ai pas trouvé un bon exemple sur la façon dont cela est résolu et je ne comprends toujours pas pourquoi cela arrive.

Quelqu'un sait comment gérer ce problème?

MISE À JOUR:

J'ai essayé de se connecter à un autre compte FTP et là tout fonctionne très bien. Par conséquent, j'ai testé mon FTP 192.168.10.35:21 mais ça fonctionne très bien dans CuteFTP Pro et les goûts. Ceci est encore plus étrange ..

Répondre

7

Je suppose que les problèmes de pare-feu Windows, FTP utilise d'autres ports que le port 21 - parfois changer le mode FTP d'actif à passif aide à faire fonctionner les choses.

reqFTP.UsePassive = false; 

Regardez ce bon article sur FTP: Active FTP vs. Passive FTP, a Definitive Explanation

+0

Je pense que je vois la différence, mais je n'arrive pas à passer de passif à actif, est-ce que quelqu'un a un bon guide pour cela? –

3

Thiès avait raison, il fallait faire avec le mode passif

Le correctif dans le code est si incroyablement simple :)

reqFTP.UsePassive = false; 

Et cela a fonctionné rapidement et sans erreurs!

1

Il est important de différencier le port COMMAND et le port DATA. Le protocole de connexion changera également selon que vous êtes en mode ACTIF ou PASSIF.

MODE ACTIF:

1) Le client établir une connexion à partir d'un port de commande sans précision aléatoire (N> 1023) au serveur par défaut port de commande (21). Le client spécifiera son port DATA (N + 1) et commencera à écouter sur ce port.

2) Le serveur établit une connexion à partir de son port DATA par défaut (20) vers le port DATA spécifié du client (N + 1).

PASSIVE MODE:

1) Le client établir une connexion à partir d'un port de commande sans précision aléatoire (N> 1023) au serveur par défaut port de commande (21) avec la commande PASSIVE. Le serveur ouvre un port DATA aléatoire (P> 1023) et l'envoie au client.

2) Le client lance une connexion depuis son port DATA (N + 1) vers le port DATA spécifié du serveur (P> 1023).Si vous utilisez le mode ACTIVE, vous devrez probablement laisser le pare-feu de votre client accepter la connexion entre le serveur et votre port (N + 1> 1024).

Dans votre exemple, vous étiez en mode ACTIVE. Votre client a initialisé une connexion depuis son port COMMAND (52183) vers le port COMMAND par défaut du serveur (21) et a spécifié son port DATA (52184 = 52183 + 1). Ensuite, le serveur a initié une connexion à partir de son port DATA par défaut (20) vers le port DATA du client (52184) qui a probablement été rejeté par le pare-feu du client.

J'espère que cela vous aide à résoudre votre problème!

Questions connexes