2016-06-23 5 views
-1

Ich versuche, die C# -Bibliothek zu verwenden, um eine Datei von einem FTP herunterzuladen. Der Code, den wir verwenden, ist geradlinig.C# Ftpclient funktioniert nicht und Python kann die Daten abrufen

static void Main(string[] args) 
     { 
      Connect(true, true, true); 
     }  
      private static void Connect(bool keepAlive, bool useBinary, bool usePassive) 
     { 
      string RemoteFtpPath = "ftp://ftp.xxxx.ac.uk/incoming/testExtractCSVcoursesContacts.csv"; 
      const string Username = "anonymous"; 
      const string Password = "[email protected]"; 

      var request = (FtpWebRequest)WebRequest.Create(new Uri(RemoteFtpPath)); 
      request.Method = WebRequestMethods.Ftp.DownloadFile; 
      request.KeepAlive = keepAlive; 
      request.UsePassive = usePassive; 
      request.UseBinary = useBinary; 
      request.Credentials = new NetworkCredential(Username, Password); 
      request.Timeout = 30000; 

      try 
      { 
       var response = (FtpWebResponse)request.GetResponse(); 
       var responseStream = response.GetResponseStream(); 
       var reader = new StreamReader(responseStream); 

       var fileString = reader.ReadToEnd(); 

       Console.WriteLine(
        $"Success! keepAlive={keepAlive}, useBinary={useBinary}, usePassive={usePassive} Length={fileString.Length}"); 

       reader.Close(); 
       response.Close(); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(
        $"Failed! keepAlive={keepAlive}, useBinary={useBinary}, usePassive={usePassive}, message={e.Message}"); 
      } 
     } 
     ` 

Wir haben auch versucht, passiv = wahr mit identischen Ergebnissen zu setzen. Wenn wir führen Sie es, mit wireshark wir bekommen: Wireshark log c#

Jetzt haben wir versucht, das gleiche mit Python und es funktioniert ganz gut:

import urllib.request 
data = urllib.request.urlretrieve('path') 
print(data) 

die wireshark log ganz anders aussieht: wireshark log

Also verschiedene Dinge ausprobiert, aber nicht in der Lage, dies zu klären.

+1

* „funktioniert nicht“ * ist kein Problem Beschreibung. Was genau schief geht? Irgendwelche Fehler/Ausnahmen? Poste eine [Log-Datei] (http://stackoverflow.com/q/9664650/850848), Callstack, alles (alles). Ihr Wireshark-Protokoll von der C# -Sitzung zeigt keine FTP-Anfragen an, sodass wir nicht wissen können, dass der Server "500" antwortet. Obwohl es wahrscheinlich die "OPTS utf8 on" ist, hat die 'FtpWebRequest' nichts dagegen, abgelehnt zu werden. –

+0

Ja, das Problem war, dass wir keine Verbindung herstellen konnten. Sie haben recht, nachdem wir weitere Nachforschungen angestellt haben, fanden wir heraus, dass die C# -Bibliothek immer die OPTS verwendet, und es scheint, dass dieser FTP-Server eine andere Konfiguration hatte. Nach dem Ändern der Bibliothek wird jetzt alles sortiert. Der FtpWebRequest kann nicht konfiguriert werden, um mit dieser Art von Servern zu arbeiten. Danke für Ihre Hilfe –

Antwort

0

Einige FTP-Server unterstützen OPTS UTF8 nicht, übertragen aber dennoch Dateinamen in UTF8. (Beachten Sie, dass 'OPTs UTF8' vom FTP-Internationalisierungsstandard NICHT benötigt wird, obwohl die UTF8-Dateinamen unterstützt werden.) Die .NET-Ftp-Klassen verwenden die Standard-Codepage, wenn sie keine OK-Antwort auf OPTS UTF8 erhalten. Es ist bedauerlich, dass MS keine Möglichkeit bietet, UTF8 trotzdem zu verwenden, da Sie dadurch keine internationalen Dateinamen zu und von anderen UTF8-kompatiblen Servern übertragen können.

Die Frage nach der Verwendung einer anderen Bibliothek sortiert wird als FtpWebRequest nicht unterstützt es

Verwandte Themen