2009-05-18 10 views
9

Ich bekomme eine Ausnahme, wenn ich versuchen, FTP auf meinem Windows 2008 Server von C# -Code mit VS2008 als Debugger.Legen Sie Portnummer bei der Verwendung von FtpWebRequest in C#

Mein Test-Klasse sieht wie folgt aus:

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); 
     } 
    } 
} 

Wenn ich den Code ausführen ich eine Verbindung bekommen konnte nicht mit FTP-Fehler 227 in der GetRequestStream() -Aufruf. In Ausnahme ich die Verbindung sehen kann nicht auf: 192.168.10.35:52184

Ich habe keine Ahnung, wie es mit Port kommt 52184. ich im ftpServerIP angeben, dass es sich um Port sein sollte 21.

Ich habe ein paar Personen mit den gleichen Problemen bei Google gefunden, aber ich habe kein gutes Beispiel dafür gefunden, wie das gelöst ist und ich verstehe immer noch nicht, warum es passiert.

Wer weiß, wie mit diesem Problem umzugehen?

UPDATE:

Ich habe versucht, auf eine andere FTP-Account zu verbinden und dort alles funktioniert gut. Daher habe ich mein 192.168.10.35:21 FTP getestet, aber es funktioniert gut in CuteFTP Pro und dergleichen. nur Dies macht es noch seltsam ..

Antwort

7

Meine Vermutung Probleme Windows-Firewall sein würde, verwendet FTP andere Ports als nur Port 21 - manchmal auf den FTP-Modus vom aktiven zum passiven Wechsel hilft Arbeits Dinge zu bekommen.

reqFTP.UsePassive = false; 

Schauen Sie sich diesen guten Artikel über FTP: Active FTP vs. Passive FTP, a Definitive Explanation

+0

Ich denke, ich sehe den Unterschied, aber ich kann nicht von Passiv zu Aktiv wechseln, hat jemand eine gute Anleitung dafür? –

3

Thies es richtig, hatte es mit passivem Modus

Die Fehlerbehebung im Code zu tun, so wahnsinnig einfach :)

reqFTP.UsePassive = false; 

Und es hat schnell und ohne Fehler gearbeitet!

1

Es ist wichtig, den COMMAND-Port und den DATA-Port zu unterscheiden. Das Verbindungsprotokoll ändert sich auch abhängig davon, ob Sie sich im AKTIVEN oder PASSIVEN Modus befinden.

ACTIVE MODE:

1) Der Client initiieren eine Verbindung von einem zufälligen unspezifiziert COMMAND-Port (N> 1023) auf den Standardserverbefehlsport (21). Der Client gibt seinen Datenport (N + 1) an und beginnt an diesem Port zu horchen.

2) Der Server initiiert eine Verbindung von seinem Standard-DATA-Port (20) zum angegebenen Client-DATA-Port (N + 1).

PASSIVE MODE:

1) Der Client initiieren eine Verbindung von einem zufälligen unspezifiziert COMMAND-Port (N> 1023) auf den Standardserver COMMAND-Port (21) mit dem PASSIVE-Befehl. Der Server öffnet einen zufälligen DATA-Port (P> 1023) und sendet ihn an den Client.

2) Der Client initiiert eine Verbindung von seinem DATA-Port (N + 1) zum angegebenen Server-DATA-Port (P> 1023).

Wenn Sie den ACTIVE-Modus verwenden, müssen Sie wahrscheinlich die Firewall Ihres Clients die Verbindung vom Server zu Ihrem Port akzeptieren lassen (N + 1> 1024).

In Ihrem Beispiel waren Sie im ACTIVE-Modus. Ihr Client hat eine Verbindung von seinem COMMAND-Port (52183) zum standardmäßigen COMMAND-Port des Servers (21) initiiert und seinen DATA-Port angegeben (52184 = 52183 + 1). Dann initiierte der Server eine Verbindung von seinem Standard-DATA-Port (20) zu dem DATA-Port des Clients (52184), der höchstwahrscheinlich von der Firewall des Clients abgelehnt wurde.

Ich hoffe, das hilft Ihnen, Ihr Problem zu lösen!

Verwandte Themen