FTP 通过 FTP 传输大文件时创建超时错误

FTP creationTimout error while transfering large files over FTP

我正在通过 FTP 服务器向客户端传输更新的程序。该文件夹总大小为 250 MB,我正面临这个问题。

"System.Net.WebException: System error. ---> System.Net.InternalException: System error. at System.Net.PooledStream.PrePush(Object expectedOwner) at System.Net.ConnectionPool.PutConnection(PooledStream pooledStream, Object owningObject, Int32 creationTimeout, Boolean canReuse) at System.Net.FtpWebRequest.FinishRequestStage(RequestStage stage) at System.Net.FtpWebRequest.SyncRequestCallback(Object obj) at System.Net.FtpWebRequest.RequestCallback(Object obj) at System.Net.CommandStream.Dispose(Boolean disposing) at System.IO.Stream.Close()\r\n at System.IO.Stream.Dispose() at System.Net.ConnectionPool.Destroy(PooledStream pooledStream) at System.Net.ConnectionPool.PutConnection(PooledStream pooledStream, Object owningObject, Int32 creationTimeout, Boolean canReuse) at System.Net.FtpWebRequest.AttemptedRecovery(Exception e) at System.Net.FtpWebRequest.SubmitRequest(Boolean async) --- End of inner exception stack trace --- at System.Net.FtpWebRequest.GetResponse() at WMSUpdateManager.FTPManagerClass.getFileSizeOfDir(String filename) in C:\Users\USER\source\repos\WMSUpdateManager\WMSUpdateManager\FTPManagerClass.cs:line 472 at WMSUpdateManager.FTPManagerClass.getFileSize(String filename) in C:\Users\USER\source\repos\WMSUpdateManager\WMSUpdateManager\FTPManagerClass.cs:line 439 at WMSUpdateManager.FTPManagerClass.DownloadFileSet(String remoteFile, String localFile) in C:\Users\USER\source\repos\WMSUpdateManager\WMSUpdateManager\FTPManagerClass.cs:line 118"

我还在递归函数中使用此块来获取目录大小。

FtpWebRequest sizeRequest;

sizeRequest = (FtpWebRequest)FtpWebRequest.Create(host + "/" + filename);
sizeRequest.Credentials = new NetworkCredential(username, password);
sizeRequest.UsePassive = true;
sizeRequest.KeepAlive = true;
sizeRequest.Method = WebRequestMethods.Ftp.GetFileSize;
sizeRequest.UseBinary = true;
sizeRequest.EnableSsl = false;
sizeRequest.Timeout = -1;
FtpWebResponse respSize = (FtpWebResponse)sizeRequest.GetResponse();   //problem at line 472 
size = respSize.ContentLength;
sizeRequest = null;
respSize.Close();

My log file.

这看起来像罪魁祸首:

System.Net Information: 0 : [7640] FtpControlStream#54444047 - Received response [421 No-transfer-time exceeded. Closing control connection.]

如果您不进行任何文件传输,您的 FTP 服务器将在一段时间后关闭您的连接。 "Size" 请求可能不算作 "transfers"。


你可以做的是在服务器关闭当前连接之前强制FtpWebRequest打开新连接。

例如,这将使 .NET 每分钟打开一个新连接:

sizeRequest.ConnectionGroupName = DateTime.Now.ToString("yyyy-MM-dd-HH-mm");

另请参阅:

  • Best method to close a keep-alive FTP or FTPS connection in C# (.NET 4.6)?