我有以下问题:
我正在使用C#ftp方法自动将文件发送到FTP服务器。程序不断运行,检查预定义的目录。如果它在目录中找到文件,则应该将它们上载到定义的ftp服务器。大约有80个目录,大多数时候程序都有事可做。一切正常,除了以下场景:
该文件正在上传。
上传时发生错误:远程主机已关闭,超出配额或类似情况。
尝试再次上载文件,并再次发生错误。
尝试上传第三个,第四个......时间的文件,然后是这行代码:
流requestStream = ftpRequest.GetRequestStream();
抛出WebException状态:未定义,描述:已达到此操作的时间限制(或类似的东西 - 我不得不将其从抛光中转换)。在抛出此WebException时,对其他服务器(来自不同目录的文件)的ftp请求成功,因此看起来只有连接到这个ftp服务器的问题。
这一切都导致没有进一步尝试上传文件成功。但是,可以通过其他ftp客户端上传此文件。当我重新启动程序时,一切都顺利进行。我应该以某种方式手动释放ftp资源?我正在使用FtpWebRequest的KeepAlive属性设置为true ..
如果有人能对这个问题有所了解,我将非常感激。
编辑:
我按照David的提示找到了我没有在requestStream上调用Close()方法的地方,我修复了它,但问题又重新出现了。
我会粘贴一些代码然后。以下是将文件上载到服务器的方法的一部分。如果它失败了,正在进行另一次尝试,例如:
while (retryCounter++ < retryNumber)
{
//upload file,
//if succeeded, break
}
在while-block里面有:
FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(remoteFileName);
ftpRequest.UseBinary = true;
ftpRequest.UsePassive = true;
ftpRequest.Credentials = new NetworkCredential(UserName, Password);
ftpRequest.ReadWriteTimeout = SendTimeout;
ftpRequest.Timeout = ConnectTimeout;
ftpRequest.KeepAlive = true;
ftpRequest.Proxy = null;
ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
Stream requestStream = null;
try
{
using (MemoryStream fileStream = new MemoryStream(localFile))
{
byte[] buffer = new byte[BufferSize];
int readCount = fileStream.Read(buffer, 0, BufferSize);
int bytesSentCounter = 0;
while (readCount > 0)
{
requestStream.Write(buffer, 0, readCount);
bytesSentCounter += readCount;
readCount = fileStream.Read(buffer, 0, BufferSize);
System.Threading.Thread.Sleep(100);
}
}
requestStream.Close();
requestStream = null;
FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse();
FtpStatusCode code = response.StatusCode;
string description = response.StatusDescription;
response.Close();
_logger.Information("Upload file result : status code {0}, status description {1}", code, description);
if (code == FtpStatusCode.ClosingData)
{
_logger.Information("File {0} uploaded successfully", localFileName);
}
else
{
_logger.Error("Uploading file {0} did not succeed. Status code is {1}, description {2}", localFileName, code, description);
}
}
catch (WebException ex)
{
if (requestStream != null)
requestStream.Close();
ftpRequest.Abort();
FtpStatusCode code = ((FtpWebResponse)ex.Response).StatusCode;
string description = ((FtpWebResponse)ex.Response).StatusDescription;
_logger.Error("A connection to the ftp server could not be established. Status code: {0}, description: {1} Exception: {2}. Retrying...", code, description, ex.ToString());
}
所以,情况再次如下:
1.正在上载文件,并且发生System.Net.Sockets.SocketException。
2.正在进行另一次尝试,并重新发生System.Net.Sockets.SocketException。
3.在我调用uploadfile方法之前,我会通过尝试列出远程目录来检查远程服务器是否已启动并且一切正常。从现在开始,通过电话
ftpRequest.GetResponse()(其中ftpRequest.Method是WebRequestMethods.Ftp.ListDirectory)我得到状态为Undefined的WebException,以及描述:已达到此操作的时间限制。当我重新启动应用程序时,问题消失了。
我找不到其他没有正确释放流的地方,也不知道接下来要做什么。