2014-06-05 7 views
5

Ich habe einen FTP-Client erstellt, der mehrmals am Tag eine Verbindung herstellt, um Protokolldateien von einem FTP-Server abzurufen.So trennen Sie den FTP-Server ordnungsgemäß mit FtpWebRequest

Das Problem ist, dass nach ein paar Stunden bekomme ich eine Fehlermeldung vom FTP-Server (-421 Sitzungslimit erreicht ..). Wenn ich die Verbindungen mit netstat überprüfe, kann ich mehrere 'HERGESTELLTE' Verbindungen zum Server sehen, obwohl ich die Verbindung "geschlossen" habe.

Wenn ich versuche, das gleiche über die Befehlszeile oder FileZilla zu tun, sind die Verbindungen ordnungsgemäß geschlossen.

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; 

Wie kann ich die Verbindung ordnungsgemäß schließen/trennen? Habe ich etwas vergessen?

Antwort

6

Versuchen Sie, die FtpWebRequest.KeepAlive-Eigenschaft auf false festzulegen. Wenn KeepAlive auf false gesetzt ist, wird die Steuerverbindung zum Server geschlossen, wenn die Anforderung abgeschlossen ist.

ftpWebRequest.KeepAlive = false; 
1

Haben Sie versucht, Ihre Antwort in einer using-Anweisung zu verpacken?

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 implementiert keine IDisposable-Schnittstelle. Ich werde versuchen, einen finally Block hinzuzufügen und die Streams dort zu schließen. – user797717

+0

Sind Sie sicher, MSDN scheint es zu sagen. http://msdn.microsoft.com/en-us/library/system.net.ftpwebresponse(v=vs.110).aspx – Nattrass

+0

Ja, Sie haben Recht. Ich habe versucht, die FtpWebRequest und nicht die FtpWebResponse zu wickeln. – user797717

Verwandte Themen