2012-09-20 4 views
1

En essayant de transférer des fichiers vers et ftp Server, mais quand j'exécute la méthode, il télécharge seulement 2 fichiers, puis stalle. Il tombe en panne sur cette ligneTéléchargement de fichiers sur le serveur FTP

Stream uploadStream = reqFTP.GetRequestStream(); 

Quand je tire cette ligne les 2 premières fois, le programme vérifie mon certificat et se poursuit ensuite, mais la troisième fois il cale et ne passe vérifier mes certificats.

ici est le code complet:

public void UploadLocalFiles(string folderName) 
     { 
      try 
      { 

       string localPath = @"\\localFolder\" + folderName; 
       string[] files = Directory.GetFiles(localPath); 
       string path;    

       foreach (string filepath in files) 
       { 
        string fileName = Path.GetFileName(filepath); 
        reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://serverIP/inbox/"+fileName)); 
        reqFTP.UsePassive = true; 
        reqFTP.UseBinary = true; 
        reqFTP.Credentials = new NetworkCredential("username", "password"); 
        reqFTP.EnableSsl = true; 
        ServicePointManager.ServerCertificateValidationCallback = Certificate; 
        reqFTP.Method = WebRequestMethods.Ftp.UploadFile; 

        FileInfo fileInfo = new FileInfo(localPath [email protected]"\"+ fileName); 
        FileStream fileStream = fileInfo.OpenRead(); 

        int bufferLength = 2048; 
        byte[] buffer = new byte[bufferLength]; 

        Stream uploadStream = reqFTP.GetRequestStream(); 
        int contentLength = fileStream.Read(buffer, 0, bufferLength); 

        while (contentLength != 0) 
        { 
         uploadStream.Write(buffer, 0, bufferLength); 
         contentLength = fileStream.Read(buffer, 0, bufferLength); 
        } 
       } 

      } 
      catch (Exception e) 
      { 
       Console.WriteLine("Error in GetLocalFileList method!!!!!" + e.Message); 
      } 

     } 

Comme je Saied, quand je tends le code uloadStream vérifie mes certificats, voici ma méthode de certificat

public bool Certificate(Object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors errors) 
     { 
      { return cert.Issuer == "myCertificate"; } 
     } 

Y at-il un moyen de seulement se connecter au serveur ftp une fois, et faire le certificat une fois et tenir la session ?? cuz droite chaque fois que je veux télécharger ou télécharger un fichier je me connecte et vérifie le certificat pour chaque fichier ..

+0

qui est probablement pas la cause de votre problème, mais vous devez toujours cours d'eau à proximité après utilisation (dans un bloc finally peut-être?): UploadStream.Close () – slawekwin

Répondre

1

Vous rencontrez probablement la limite de connexion par défaut pour ServicePoint.ConnectionLimit Property, qui est 2. Le FtpWebRequest a une propriété ServicePoint que vous pouvez ajuster. Vous devrez fermer votre uploadStream dès que le téléchargement est terminé.

+0

en ajoutant ceci avant ma ligne de capture, les fichiers ne sont pas téléchargés, quand je les enlève seulement les 2 fichiers sont téléchargés. uploadStream.Close(); fileStream.Close(); – Lahib

+0

Im définissant le ServicePoint.ConnectionLimit = files.Length, et cela fonctionne. Mais je ne sais pas si c'est la meilleure pratique. – Lahib

2

Il suffit d'ajouter cette ligne au point d'entrée de votre application:

System.Net.ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true); 
+0

cela définit le certificat à toujours être accepté? – Lahib

+0

Oui. J'ai une situation similaire tout en consommant un service web. Donc, fondamentalement, s'il y a un besoin d'accepter le certificat cela fera ... –

Questions connexes