2010-12-02 16 views
8

Ich brauche etwas Anleitung. Ich muss ein anpassbares FTP in C# entwickeln, das mit der App.Config-Datei konfiguriert werden sollte. Außerdem sollte der FTP-Server die Daten von jedem Client an einen beliebigen Server senden, der wiederum von der Konfigurationsdatei abhängig ist.FTPS (FTP über SSL) in C#

Ich werde schätzen, wenn jemand führen kann, wenn es eine API oder irgendeinen anderen nützlichen Vorschlag gibt, oder mich in die richtige Richtung bewegen.

Antwort

3

Wir verwenden edtFTPnet mit guten Ergebnissen.

+4

Nur, damit Menschen die kostenlose Version wissen nicht, FTPS unterstützt, die Pro-Version tut – tsukimi

15

Sie können FtpWebRequest verwenden; Dies ist jedoch ein ziemlich niedriges Niveau. Es gibt eine übergeordnete Klasse WebClient, die für viele Szenarien viel weniger Code benötigt; FTP/SSL wird jedoch standardmäßig nicht unterstützt. Glücklicherweise können Sie WebClient Arbeit mit FTP/SSL, indem Sie Ihre eigenen Präfix Registrierung:

private void RegisterFtps() 
{ 
    WebRequest.RegisterPrefix("ftps", new FtpsWebRequestCreator()); 
} 

private sealed class FtpsWebRequestCreator : IWebRequestCreate 
{ 
    public WebRequest Create(Uri uri) 
    { 
     FtpWebRequest webRequest = (FtpWebRequest)WebRequest.Create(uri.AbsoluteUri.Remove(3, 1)); // Removes the "s" in "ftps://". 
     webRequest.EnableSsl = true; 
     return webRequest; 
    } 
} 

Sobald Sie dies tun, können Sie WebClient fast wie normale verwenden, es sei denn, dass Ihr URIs beginnen mit „ftps: //“ statt von "ftp: //". Der einzige Nachteil ist, dass Sie den Parameter method angeben müssen, da es keinen Standard gibt. Z.B.

using (var webClient = new WebClient()) { 
    // Note here that the second parameter can't be null. 
    webClient.UploadFileAsync(uploadUri, WebRequestMethods.Ftp.UploadFile, fileName, state); 
} 
+0

Aus den Kommentaren von [a doppelte Antwort] (https://stackoverflow.com/a/31432519/1869660): Um alle möglichen Zertifikate zu akzeptieren, die der Client antrifft, funktioniert das: 'ServicePointManager.ServerCertificateValidationCallback + = (Absender, Zertifikat, Kette, sslPolicyErrors) => true;' – Sphinxxx

+0

@Sphinxxx Seien Sie sich bewusst, dass Sie blindlings jedes Server-Zertifikat akzeptieren ein Mann-in-der-Mitte-Angriff. –

+0

Ja, es ist nicht die eleganteste Lösung. Hast du eine sicherere Alternative? – Sphinxxx