2014-10-09 20 views
6

sto cercando di ottenere l'elenco di directory di un server FTPS FileZilla usando il codice seguente:La connessione sottostante è stata chiusa. Il server ha commesso una violazione del protocollo

ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + "/" + directory); 
ftpRequest.EnableSsl = true; 

ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateCertificate); 
ftpRequest.Credentials = new NetworkCredential(user, pass); 
ftpRequest.UseBinary = true; 
ftpRequest.UsePassive = true; 
ftpRequest.KeepAlive = true; 
ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory; 
ftpResponse = (FtpWebResponse)ftpRequest.GetResponse(); 

ho ottenuto un'eccezione quando FtpWebResponse)ftpRequest.GetResponse() viene eseguito:

sottostante la connessione era chiusa. Il server ha commesso una violazione del protocollo .

Quando si passa alla normale connessione FTP. Tutto funziona correttamente.

Mi sono perso qualcosa per stabilire questa connessione FTPS? grazie per aiuto

+0

Avete accesso a Filezilla Server? Sei sicuro che il certificato sia valido? Lo hai configurato correttamente per usare ** FTPS esplicito ** –

+0

Sì, ho accesso al server. Anche il certificato è valido e viene controllato l'FTPS esplicito. Sto usando la porta 990 che si riferisce alla connessione implicita SSL/TLS. È supportato in FtpWebRequest? – MadNeox

risposta

6

implicito FTPS è non supportati dalla classe FtpWebRequest (vedi here).

Quando EnableSsl è impostato a true, in realtà fa scattare un comando AUTH TLS al server, chiedendo di avviare una sessione di esplicitaFTPS.

Nel tuo caso, devi configurare Filezilla Server per utilizzare FTPS esplicito. La procedura è documentata su Filezilla Wiki

+0

questo è vero.Prenderò in considerazione la possibilità di provare le librerie di terze parti per utilizzare la sessione FTPS esplicita/implicita. Grazie per l'aiuto. – MadNeox

+1

È possibile utilizzare la libreria [FtpClient] (http://netftp.codeplex.com/). –

+0

Lo farò ... Grazie ancora per il supporto e l'aiuto. Buona giornata ! – MadNeox

4

Ho riscontrato lo stesso problema ma per il caricamento di un file, su ftpWriter.Close(). Inoltre, non sono riuscito a fare un GetRequestStream dopo una PrinWorkingDirectory di successo, ad esempio.

Il problema sembra essere un "Aspettate: 100-continue" nel post - mentre non l'ho ancora controllato, il problema è da qualche parte lì.

Ho provato ogni soluzione trovata su internet: cambiare il KeepAlive su true, aggiungendo al app.config presentare

<system.net> 
    <settings> 
     <servicePointManager expect100Continue="false"/> 
     <httpWebRequest useUnsafeHeaderParsing="true"/> 
    </settings> 
</system.net> 

Niente di veramente funzionato.

Ho passato molto tempo e ho provato diverse altre librerie di terze parti (idea che non mi piaceva troppo), fino a quando non sono arrivato a un codice che usava le stesse classi e il metodo, ma ha funzionato !! Dopo aver analizzato il codice, ho finalmente capito: il codice è stato indirizzato a .NET Framework 2.0 mentre il mio codice era destinato a .NET Framework 4.5. Sembra che Microsoft abbia fatto un piccolo errore passando dal Framework 3.5 al Framework 4.

Poiché non è una soluzione per convertire i nuovi progetti in target di un vecchio framework, è possibile creare una dll per le operazioni FTP, puntando a 3.5 .NET Framework, oppure, è possibile utilizzare librerie di terze parti.

Sono forse un po 'in ritardo, ma probabilmente aiuterà altri sviluppatori frustrati su questo argomento, in futuro.

+0

Lo proverò –

+0

Se si tratta di un bug nel client, mi chiedo perché sembra che succeda solo quando ci si connette al server filezilla? Il mio codice funziona bene con altri server –

Problemi correlati