2016-06-04 3 views
5

나는 확인을위한 FTP 폴더에 루프를 원하는 : C 번호 - -에서는 FtpWebRequest 파일이 내가 할</p> <p>도착 경우 같은 연결을 통해 여러 요청/로그인

FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://localhost:8080"); 
request.Credentials = new NetworkCredential("anonymous", ""); 
request.Method = WebRequestMethods.Ftp.ListDirectoryDetails; 

while(true) 
{ 
    using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) 
    using (Stream responseStream = response.GetResponseStream()) 
    using (StreamReader reader = new StreamReader(responseStream)) 
    { 
     Console.WriteLine(reader.ReadToEnd()); 

     reader.Close(); 
     response.Close(); 
    } 
} 

그러나 두 번째 반복에서

I 예외가 얻을 : 스트림을 읽을 수 없습니다

+0

'using'문을 사용하거나 response, responseStream 및 reader를 삭제하십시오. – Peter4499

+0

답변을 주셔서 감사합니다. 코드를 업데이트했지만 항상 예외가 있습니다. –

답변

3

죄송합니다. 한 번만 요청을하고 여러 번 응답을 받으려고합니다. 아래 코드를 시도하십시오.

while(true) 
{ 
    FtpWebRequest request =  (FtpWebRequest)WebRequest.Create("ftp://localhost:8080"); 
    request.Credentials = new NetworkCredential("anonymous", ""); 
    request.Method = WebRequestMethods.Ftp.ListDirectoryDetails; 

    using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) 
    using (Stream responseStream = response.GetResponseStream()) 
    using (StreamReader reader = new StreamReader(responseStream)) 
    { 
     Console.WriteLine(reader.ReadToEnd()); 

     reader.Close(); 
     response.Close(); 
    } 
} 

각 루프의 끝 부분에 일시 중지를 추가해야합니다. 서버를 포격하고 싶지는 않습니다.

+0

예, 작동하지만 매회 다시 로그인해야합니까? –

+1

각 요청은 별도의 엔터티입니다. 실제로 로그인하지 않고 누가 요청을했는지 식별합니다. 'FtpWebRequest' 클래스는 Ftp 호출에 대한 래퍼이지만 여전히 웹 방법론을 사용합니다. 각 요청은 자체 엔티티입니다. – Peter4499

3

FtpWebRequest 인스턴스를 여러 요청에 다시 사용할 수 없습니다.

그러나 FtpWebRequest은 연결 풀에서 작동하기 때문에 실제로 기본 FTP 연결을 다시 사용할 수 있습니다. FtpWebRequest.KeepAlive이 기본값 인 true으로 설정되어 있어야합니다.

KeepAlivetrue으로 설정된 경우 요청이 완료되면 기본 FTP 연결이 닫히지 않습니다. 동일한 URL을 사용하여 FtpWebRequest의 다른 인스턴스를 만들면 연결이 다시 사용됩니다.

while (true) 
{ 
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://localhost:8080"); 
    request.Credentials = new NetworkCredential("anonymous", ""); 
    request.Method = WebRequestMethods.Ftp.ListDirectoryDetails; 
    // reuse the connection (not necessary, as the true is the default) 
    request.KeepAlive = true; 

    using (FtpWebResponse response = (FtpWebResponse)request.GetResponse()) 
    using (Stream responseStream = response.GetResponseStream()) 
    using (StreamReader reader = new StreamReader(responseStream)) 
    { 
     Console.WriteLine(reader.ReadToEnd()); 

     reader.Close(); 
     response.Close(); 
    } 
} 
+0

'KeepAlive' 속성에 대한이 precison에 감사드립니다. –