2014-06-05 15 views
5

Tôi đã tạo một ứng dụng khách FTP kết nối nhiều lần trong ngày để truy xuất các tệp nhật ký từ máy chủ FTP.Cách ngắt kết nối đúng cách từ máy chủ FTP với FtpWebRequest

Vấn đề là sau một vài giờ tôi nhận được thông báo lỗi từ máy chủ FTP (-421 giới hạn phiên đạt được ..). Khi tôi kiểm tra các kết nối với netstat, tôi có thể thấy một số kết nối 'THÀNH LẬP' cho máy chủ mặc dù tôi đã "đóng" kết nối.

Khi tôi cố gắng thực hiện tương tự trên dòng lệnh hoặc FileZilla, các kết nối được đóng đúng cách.

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; 

Làm cách nào để đóng/ngắt kết nối đúng cách? Tôi có quên gì không?

Trả lời

6

Hãy thử và đặt thuộc tính FtpWebRequest.KeepAlive thành sai. Nếu KeepAlive được đặt thành false, thì kết nối điều khiển tới máy chủ sẽ bị đóng khi yêu cầu hoàn tất.

ftpWebRequest.KeepAlive = false; 
1

Bạn đã thử gói câu trả lời của mình trong tuyên bố sử dụng chưa?

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 không triển khai giao diện IDisposable. Tôi sẽ thử thêm một khối cuối cùng và đóng các dòng trong đó. – user797717

+0

Bạn có chắc chắn, MSDN có vẻ như nói nó. http://msdn.microsoft.com/en-us/library/system.net.ftpwebresponse(v=vs.110).aspx – Nattrass

+0

Vâng, bạn nói đúng. Tôi đã cố gắng để bọc FtpWebRequest và không phải là FtpWebResponse. – user797717

Các vấn đề liên quan