9 Stimmen

Wie man sich ordnungsgemäß vom FTP-Server mit FtpWebRequest trennt

Ich habe einen FTP-Client erstellt, der mehrmals am Tag eine Verbindung herstellt, um Logdateien von einem FTP-Server abzurufen.

Das Problem ist, dass ich nach einigen Stunden eine Fehlermeldung vom FTP-Server erhalte (-421 Sitzungslimit erreicht...). Wenn ich die Verbindungen mit netstat überprüfe, sehe ich mehrere 'ETABLIERTE' Verbindungen zum Server, obwohl ich die Verbindung "geschlossen" habe.

Wenn ich dasselbe über die Befehlszeile oder FileZilla versuche, werden 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);
/* Ressourcenfreigabe */

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

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

14voto

Jamleck Punkte 1007

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

ftpWebRequest.KeepAlive = false;

1voto

Nattrass Punkte 1173

Hast du versucht, deine Antwort in einem using-Statement zu umschließen?

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X