2014-06-05 30 views
5

Ho creato un client ftp che si connette diverse volte durante il giorno per recuperare i file di registro da un server FTP.Come disconnettersi correttamente dal server FTP con FtpWebRequest

Il problema è che dopo alcune ore ricevo un messaggio di errore dal server FTP (limite di -421 sessione raggiunto ..). Quando controllo le connessioni con netstat, posso vedere diverse connessioni 'ESTABLISHED' al server anche se ho "chiuso" la connessione.

Quando si tenta di eseguire lo stesso tramite la riga di comando o FileZilla, le connessioni vengono chiuse correttamente.

ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + "/" + remoteFile); 
ftpRequest.Credentials = new NetworkCredential(user, pass); 
ftpRequest.UseBinary = true; 
ftpRequest.UsePassive = true; 
ftpRequest.KeepAlive = true; 
ftpRequest.Method = WebRequestMethods.Ftp.DownloadFile; 
ftpResponse = (FtpWebResponse)ftpRequest.GetResponse(); 
ftpStream = ftpResponse.GetResponseStream(); 
FileStream localFileStream = new FileStream(localFile, FileMode.Create); 
int bytesRead = ftpStream.Read(byteBuffer, 0, bufferSize); 
/* Resource Cleanup */ 

localFileStream.Close(); 
ftpStream.Close(); 
ftpResponse.Close(); 
ftpRequest = null; 

Come posso chiudere/scollegare la connessione correttamente? Ho dimenticato qualcosa?

risposta

6

Provare e impostare la proprietà FtpWebRequest.KeepAlive su false. Se KeepAlive è impostato su false, la connessione di controllo al server verrà chiusa al termine della richiesta.

ftpWebRequest.KeepAlive = false; 
1

Hai provato a racchiudere la risposta in una dichiarazione using?

using (FtpWebResponse response = request.GetResponse() as FtpWebResponse) 
     { 
      using (Stream responseStream = response.GetResponseStream()) 
      { 
       using (StreamReader streamReader = new StreamReader(responseStream)) 
       { 
        string responseString = streamReader.ReadToEnd(); 

        Byte[] buffer = Encoding.UTF8.GetBytes(responseString); 
        memoryStream = new MemoryStream(buffer); 
       } 

       responseStream.Close(); 
      } 
      response.Close(); 
     } 
+1

AFAIK FtpWebResponse non implementa l'interfaccia IDisposable. Proverò ad aggiungere un blocco finalmente e chiudere i flussi in là. – user797717

+0

Sei sicuro, MSDN sembra dirlo. http://msdn.microsoft.com/en-us/library/system.net.ftpwebresponse(v=vs.110).aspx – Nattrass

+0

Sì, hai ragione. Stavo cercando di avvolgere FtpWebRequest e non FtpWebResponse. – user797717