Comment résoudre FTP délais d'attente en application en C#
Je suis en utilisant le code C# suivant pour FTP un ~40 MO fichier CSV à partir d'un fournisseur de services à distance. Environ 50% du temps, le téléchargement se bloque et finalement son temps. Dans mon appli journal, j'obtiens une ligne comme:
> Unable to read data from the transport
> connection: A connection attempt
> failed because the connected party did
> not properly respond after a period of
> time, or established connection failed
> because connected host has failed to
> respond.
Quand je télécharge le fichier de manière interactive à l'aide d'un client graphique tels que leechftp, les téléchargements presque jamais accrocher, et terminer en environ 45 secondes. Je vais avoir un sacré bout de temps à comprendre ce qui ne va pas.
Quelqu'un peut-il suggérer comment je peux l'instrument de ce code pour obtenir plus de perspicacité dans ce qui se passe, ou une meilleure façon de télécharger ce fichier? Dois-je augmenter la taille de la mémoire tampon? Par combien? Éviter le tampon écrit sur le disque et essayez d'avaler tout le fichier en mémoire? Tous les conseils apprécié!
...
private void CreateDownloadFile()
{
_OutputFile = new FileStream(_SourceFile, FileMode.Create);
}
public string FTPDownloadFile()
{
this.CreateDownloadFile();
myReq = (FtpWebRequest)FtpWebRequest.Create(new Uri(this.DownloadURI));
myReq.Method = WebRequestMethods.Ftp.DownloadFile;
myReq.UseBinary = true;
myReq.Credentials = new NetworkCredential(_ID, _Password);
FtpWebResponse myResp = (FtpWebResponse)myReq.GetResponse();
Stream ftpStream = myResp.GetResponseStream();
int bufferSize = 2048;
int readCount;
byte[] buffer = new byte[bufferSize];
int bytesRead = 0;
readCount = ftpStream.Read(buffer, 0, bufferSize);
while (readCount > 0)
{
_OutputFile.Write( buffer, 0, readCount );
readCount = ftpStream.Read( buffer, 0, bufferSize );
Console.Write( '.' ); //show progress on the console
bytesRead += readCount;
}
Console.WriteLine();
logger.logActivity( " FTP received " + String.Format( "{0:0,0}", bytesRead ) + " bytes" );
ftpStream.Close();
_OutputFile.Close();
myResp.Close();
return this.GetFTPStatus();
}
public string GetFTPStatus()
{
return ((FtpWebResponse)myReq.GetResponse()).StatusDescription;
}
OriginalL'auteur | 2009-04-24
Vous devez vous connecter pour publier un commentaire.
J'ai essayé d'utiliser FTPClient comme suggéré ci-dessus et a obtenu la même erreur de dépassement de délai, FTPClient utilise FtpWebRequest donc, je dois être en manque de quelque chose mais je ne vois pas l'intérêt.
Après quelques recherches, j'ai trouvé que -1 est la valeur de l'infini
Pour mon but c'est bien d'utiliser l'infini je suis donc allé avec que, le problème est résolu.
Voici mon code:
//obtient le fichier à partir du site FTP.
OriginalL'auteur Tom
Je vous suggère de ne pas utiliser FtpWebRequest pour l'accès FTP. FtpWebRequest est plus en état de mort cérébrale FTP API j'ai tout vu.
Actuellement, je utiliser FtpClient http://www.codeplex.com/ftpclient
J'ai aussi eu de la chance avec IndySockets http://www.indyproject.org/index.en.aspx
La chose drôle est FtpClient de CodePlex utilise FTPWebRequest API. Et l'extension est inutile. Vous devriez plutôt regarder de la classe Socket.
OriginalL'auteur Jonathan Allen
Je n'ai pas traité par FTP sur un niveau de code, mais FTP prend en charge la reprise. Peut-être que vous pourriez avoir automatiquement essayer de reprendre le téléchargement lors de l'expiration du délai de
OriginalL'auteur gillonba