Я использую следующий код C # для передачи файла CSV ~ 40 МБ от удаленного поставщика услуг. Приблизительно в 50% случаев загрузка зависает и время ожидания истекает. В моем журнале приложений я получаю строку вроде:
> 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.
Когда я загружаю файл в интерактивном режиме с помощью графического клиента, такого как LeechFTP, загрузка почти никогда не зависает и завершается примерно через 45 секунд. У меня чертовское время, чтобы понять, что происходит не так.
Кто-нибудь может подсказать, как я могу применить этот код, чтобы лучше понять, что происходит, или лучший способ загрузить этот файл? Должен ли я увеличить размер буфера? На сколько? Избегать буферизованных записей на диск и попытаться проглотить весь файл в памяти? Любой совет приветствуется!
...
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;
}