2014-06-05 2 views
5

FTP 서버에서 로그 파일을 검색하기 위해 하루 중 여러 번 연결하는 ftp 클라이언트를 만들었습니다.FtpWebRequest를 사용하여 FTP 서버에서 올바르게 연결을 끊는 방법

문제는 몇 시간 후 FTP 서버에서 오류 메시지가 표시됩니다 (세션 제한에 도달했습니다 ~ ..). netstat을 사용하여 연결을 확인할 때 연결을 "닫은"경우에도 서버에 대한 여러 개의 '연결'연결을 볼 수 있습니다.

명령 줄이나 FileZilla에서 동일한 작업을 시도하면 연결이 제대로 닫힙니다.

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; 

제대로 연결을 끊을 수 있습니까? 나는 아무것도 잊었 니?

답변

6

FtpWebRequest.KeepAlive 속성을 false로 설정하십시오. KeepAlive이 false로 설정된 경우 요청이 완료되면 서버에 대한 제어 연결이 닫힙니다.

ftpWebRequest.KeepAlive = false; 
1

사용중인 문장에서 응답을 래핑 해 보았습니까?

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는 IDisposable 인터페이스를 구현하지 않습니다. finally 블록을 추가하고 스트림을 닫습니다. – user797717

+0

정말입니까? MSDN은 그렇다고합니다. http://msdn.microsoft.com/en-us/library/system.net.ftpwebresponse(v=vs.110).aspx – Nattrass

+0

네, 맞습니다. FtpWebResponse가 아니라 FtpWebRequest를 래핑하려고했습니다. – user797717

관련 문제