2010-02-16 5 views
5

J'écris un code pour télécharger un fichier zip sur un serveur ftp. Étonnamment, le code fonctionne bien pour les petits fichiers, mais avec des fichiers plus gros, je finis par avoir un problème. J'utilise l'objet Stream et j'ai noté que mon code est bloqué en essayant de fermer le Stream (seulement pour les gros fichiers). Le code fonctionne bien si je ne ferme pas le Stream (même pour les gros fichiers). Est-ce que quelqu'un voit une logique dans la raison pour laquelle cela se produit. Et si je ne ferme pas le flux est-il possible que je pourrais finir dans le problème à l'avenir.Téléchargement FTP en utilisant .NET

extrait de code

:

FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(@"ftp://" + ftpServerIP + @"/" + fileInf.Name)); 
Stream strm = reqFTP.GetRequestStream(); 

Le code cesse de répondre (lorsque le fichier de téléchargement est grand) à:

strm.Close(); 

Il ne fait pas exception que cette partie se trouve dans try-catch.

Je ne sais pas comment obtenir une trace de pile.

+1

Comment utilisez-vous la classe FtWebRequest?Avez-vous un problème avec tous les serveurs FTP ou juste celui-là? –

+1

Qu'entendez-vous par "finir dans le problème". Pourriez-vous publier une trace de pile spécifique ou un comportement incorrect? – abc

+0

Désolé, si quelqu'un a édité ma question, pouvez-vous le faire à nouveau s'il vous plaît. – kobra

Répondre

6

Je ne sais pas exactement quelle erreur vous obtenez lors de la fermeture du flux, mais dans notre application, nous faisons beaucoup de gros téléchargements de fichiers (vidéos et images). Voici comment nous écrire à notre flux FTP:

request.KeepAlive = false; // This eliminated some of our stream closing problems 

using (Stream stream = request.GetRequestStream()) 
{ 
    stream.Write(file.Data, 0, file.Data.Length); 
} 

Je pensais que faire un bloc using aurait pour effet de faire l'appel Close lui-même, mais peut-être qu'il effectue également d'autres le nettoyage nécessaire. Notez également que j'ai désactivé les keepalives FTP, ce qui nous a causé des problèmes dans certains des sites FTP tiers sur lesquels nous avons téléchargé.

Vous devriez vraiment regarder l'exception spécifique que vous recevez plutôt que d'avaler toutes les exceptions. Le message d'erreur vous indiquera probablement ce qui ne va pas. Les problèmes les plus courants que nous avons rencontrés concernaient le mode actif contre le mode passif et les keepalives.

Edit:

Pour découvrir ce qui se passait vraiment quand nous avons eu des problèmes FTP avec NAA (et il arrive trop souvent), nous avions parfois activer le traçage dans notre application. Voir this link pour plus de détails sur l'activation du suivi. Une autre option consiste à utiliser un outil comme Wireshark pour renifler la conversation entre votre application et le serveur FTP. Si vous pouvez voir ce qui se passe dans le protocole FTP, vous aurez une meilleure chance de résoudre le problème.

+0

Merci. Dans mon code KeepAlive est faux et j'ai essayé "using", mais le code ne sort jamais du bloc "using". En ce qui concerne les erreurs, je ne reçois aucune exception, ce qui rend difficile le suivi du problème. – kobra

+0

Utilisez-vous le mode actif ou passif? – Jacob

+0

Et quand vous dites "Il n'y a aucune exception car cette partie est dans l'essai", dites-vous que le bloc catch n'est pas atteint ou que le try/catch masque votre exception? – Jacob

0

Cela peut valoir la peine d'essayer le composant FTP Open Source de here ... J'ai essayé d'utiliser FtpWebRequest et mon expérience d'utilisation était négative ... lente, expire, parce que tout naturellement, le FtpWebRequest fonctionne par le port 80 au lieu du port natif 21 ... la situation a changé de façon spectaculaire quand j'utilisé ce composant FTP, plus polyvalent et puissant ...

Edit: CommeJacob a souligné mon erreur évidente et ma vision illogique de la classe FtpWebRequest qui m'amène à croire quelque chose funky et bizarre se passait, et que c'était en quelque sorte de faire quelque chose via HTTP ... Eh bien Jacob doit avoir un point ... un cas classique de mauvaise convention de nommage dans le cadre ... Merci Jacob!

Espérons que cela aide, Cordialement, Tom.

+0

FtpWebRequest n'a jamais utilisé le port 80 pour nous. D'où obtenez-vous cette information? – Jacob

+0

@Jacob: Pourquoi est-il appelé FtpWebRequest ... il utilise le protocole http pour communiquer avec un serveur FTP ... le mot-clé est dans le nom !! Pourquoi utiliser WebRequest pour créer un FtpWebRequest? Si vous n'êtes pas d'accord ... pourquoi n'y a-t-il pas un composant ftp dédié pour communiquer directement avec le port 21? Il est enroulé autour de cette classe WebRequest ... – t0mm13b

+2

C'est juste une mauvaise réputation. HttpWebRequest utilise le port 80, et FtpWebRequest utilise le port 21. WebRequest est la classe de base abstraite pour les deux. – Jacob