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