2010-12-02 18 views
8

Ho bisogno di una guida. Devo sviluppare un FTP personalizzabile in C# che deve essere configurato utilizzando il file App.Config. Inoltre, l'FTP dovrebbe spingere i dati su qualsiasi server da qualsiasi client dipende ancora dal file di configurazione.FTPS (FTP su SSL) in C#

Apprezzerò se qualcuno può guidare, se c'è qualche API o qualche altro suggerimento utile, o spostarmi nella giusta direzione.

risposta

3

Utilizziamo edtFTPnet con buoni risultati.

+4

Giusto per far conoscere la versione gratuita non supporta FTPS, la versione pro fa – tsukimi

15

È possibile utilizzare FtpWebRequest; tuttavia, questo è un livello abbastanza basso. Esiste una classe di livello superiore WebClient, che richiede molto meno codice per molti scenari; tuttavia, non supporta FTP/SSL per impostazione predefinita. Fortunatamente, è possibile fare WebClient lavoro con FTP/SSL registrando il proprio prefisso:

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

Una volta fatto questo, è possibile utilizzare WebClient quasi come normale, se non che le vostre URI iniziano con "FTPS: //" invece di "ftp: //". L'unica avvertenza è che devi specificare il parametro method, poiché non ci sarà un default. Per esempio.

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

Dai commenti di [una risposta duplicato] (https://stackoverflow.com/a/31432519/1869660): Per accettare automaticamente tutti i certificati che il client può incontrare, funziona: 'ServicePointManager.ServerCertificateValidationCallback + = (mittente, certificato, catena, sslPolicyErrors) => true;' – Sphinxxx

+0

@Sphinxxx Tieni presente che accettare ciecamente qualsiasi certificato del server ti rende vulnerabile a un attacco man-in-the-middle. –

+0

Sì, non è la soluzione più elegante. Hai un'alternativa più sicura? – Sphinxxx