2016-06-04 7 views
5

Ich möchte auf einem FTP-Ordner für die Prüfung zu Schleife, wenn eine DateiC# - FtpWebRequest - Mehrere Anfragen über die gleiche Verbindung/login

angekommen ich tun:

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

Aber bei der zweiten Iteration I eine Ausnahme erhalten:

Der Strom kann nicht gelesen werden

+0

Verwenden Sie 'using' Anweisungen oder dispose Antwort, AntwortStream und Leser. – Peter4499

+0

Vielen Dank für Ihre Antwort, ich habe meinen Code aktualisiert, aber ich habe immer diese Ausnahme –

Antwort

3

Tut mir leid, ich habe es verpasst, du gibst nur eine Anfrage aus und versuchst mehrmals eine Antwort zu bekommen. Probieren Sie den folgenden Code aus:

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

Sie sollten jedoch am Ende jeder Schleife eine Pause hinzufügen. Sie wollen den Server nicht bombardieren.

+0

Ja, es funktioniert, aber ich muss jedes Mal erneut einloggen? –

+1

Jede Anfrage ist eine separate Entität. Es meldet sich nicht wirklich an, sondern gibt Auskunft darüber, wer die Anfrage stellt. Die 'FtpWebRequest'-Klasse ist ein Wrapper für Ftp-Aufrufe, verwendet aber immer noch die Web-Methode, jede Anfrage ist ihre eigene Entität. – Peter4499

3

Sie können die FtpWebRequest-Instanz für mehrere Anfragen nicht erneut verwenden.

Aber da die FtpWebRequest oben auf einem Verbindungspool funktioniert, kann sie tatsächlich eine zugrunde liegende FTP-Verbindung wiederverwenden. Solange FtpWebRequest.KeepAlive auf den Standardwert true eingestellt ist.

Wenn die KeepAlive auf true festgelegt ist, wird die zugrunde liegende FTP-Verbindung nicht geschlossen, wenn die Anforderung abgeschlossen ist. Wenn Sie eine weitere Instanz der FtpWebRequest mit derselben URL erstellen, wird die Verbindung erneut verwendet.

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

Danke für dieses Precison auf der 'KeepAlive' Eigenschaft –

Verwandte Themen