2013-06-17 3 views
2

J'ai besoin d'aide pour retravailler cette méthode de manière à ne pas créer une nouvelle session FTP pour chaque fichier téléchargé.FTP Webrequest Fichiers multiples sans session close

Les variables sont serveur (IP ou hostname) Dictionnaire (chemin de fichier local, chemin du serveur ftp) ex (c: /mydir/test.txt, \ entrant) PASV Utiliser le mode passif Vrai/Faux et la connexion/mot de passe pour le FTP lui-même

Je voudrais que cela fonctionne de telle manière.

1) Se connecter au serveur

2) Pour chaque fichier/paire de chemin dans le dictionnaire, télécharger le fichier

3) Se déconnecter du serveur

Est-il possible de réécrire cette méthode pour accomplir cela?

Aussi je sais que le try/catch devrait être mieux implémenté, j'aimerais avoir un try/catch block pour se connecter au FTP lui-même, puis un bloc try pour chaque fichier téléchargé mais j'ai besoin de trier la structure de la méthode en premier.

protected static bool FtpStart(string server, Dictionary<string, string> FilePath, bool PASV, string login, string password) 
    { 
     foreach (var Current in FilePath) 
     { 
      try 
      { 
       //FileInfo for Filename passed. 
       var ThisFile = new FileInfo(Current.Key); 
       // Get the object used to communicate with the server. 
       FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://" + server + Current.Value + ThisFile.Name); 
       request.UsePassive = PASV; 
       request.Method = WebRequestMethods.Ftp.UploadFile; 

       // This example assumes the FTP site uses anonymous logon. 
       request.Credentials = new NetworkCredential(login, password); 

       // Copy the contents of the file to the request stream. 
       StreamReader sourceStream = new StreamReader(Current.Key); 
       byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd()); 
       sourceStream.Close(); 
       request.ContentLength = fileContents.Length; 

       Stream requestStream = request.GetRequestStream(); 
       requestStream.Write(fileContents, 0, fileContents.Length); 
       requestStream.Close(); 
       FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
       response.Close(); 
      } 
      catch (Exception Ex) 
      { 
       Console.WriteLine(Ex.Message); 
       return false; 
      } 
     } 
     return true; 
    } 

Répondre

0

Vous pouvez KeepAlive votre demande pour éviter la fermeture de connexion

request.KeepAlive = true; 

Cela fera une connexion que le premier FTPWebRequest.

Ensuite, lorsque vous créez la dernière FTPWebRequest

request.KeepAlive = false; 

et il ferme la connexion lorsque vous avez terminé.

Questions connexes