WinForms应用程序中C#中的FTP超时
我有一个FTP服务器,可以从中提取和解析数据并下载图像。我在提取文本文件(我的数据)时从来没有遇到过问题,但我从两个目录中提取图像,其中一个目录使用与下面相同的代码(尽管显然使用了不同的Uri和图像名称数组)工作正常。为了得到一个图像列表,我有一个函数,它提取另一个文件并返回一个图像名称数组,然后我将这个图像名称数组按顺序放在循环中基本URI的末尾,以下载所有图像 底部的代码是我的函数,用于提取带有图像名称的文本文件。它有自己的URI,并且来自目录结构的不同部分。有趣的是,如果我在一个已知位置手动创建一个图像数组并输入我的图像拉取代码,它可以正常工作,但是如果我运行这个数组构建FTP函数,我的图像会在GetResponse()行中拉取超时。我已经缩短了超时时间,这样我就不必等待太长的时间来等待它失败,但它并不太短,因为正如我所说的,它可以很好地处理硬编码的图像URI列表。我在这里搜索并尝试了一些事情,认为我没有正确地释放资源,但我无法找出发生了什么 抱歉,我不是这方面的专家,但我在这个应用程序中有很多类似的代码,这是我第一次遇到FTPing的问题 需要注意的是,我有一个早期版本的应用程序,它可以正常工作,但我必须承认我在源代码版本控制方面非常松懈,没有旧代码(doh!)。我改变了一些现在正在扼杀它的东西WinForms应用程序中C#中的FTP超时,c#,winforms,ftp,C#,Winforms,Ftp,我有一个FTP服务器,可以从中提取和解析数据并下载图像。我在提取文本文件(我的数据)时从来没有遇到过问题,但我从两个目录中提取图像,其中一个目录使用与下面相同的代码(尽管显然使用了不同的Uri和图像名称数组)工作正常。为了得到一个图像列表,我有一个函数,它提取另一个文件并返回一个图像名称数组,然后我将这个图像名称数组按顺序放在循环中基本URI的末尾,以下载所有图像 底部的代码是我的函数,用于提取带有图像名称的文本文件。它有自己的URI,并且来自目录结构的不同部分。有趣的是,如果我在一个已知位置手
//Open a web request based on the URI just built from user selections
FtpWebRequest imageRequest = (FtpWebRequest)WebRequest.Create(imageUri);
imageRequest.UsePassive = false;
imageRequest.UseBinary = true;
imageRequest.KeepAlive = false;
imageRequest.Timeout = 2000;
//Act on that webrequest based on what the user wants to do (i.e. list a directory, list file, download, etc)
imageRequest.Method = WebRequestMethods.Ftp.DownloadFile;
try
{
//Now get the response from the tool as a stream.
FtpWebResponse imageResponse = (FtpWebResponse)imageRequest.GetResponse();
//Thread.Sleep(1000);
Stream imageResponseStream = imageResponse.GetResponseStream();
byte[] buffer = new byte[2048];
FileStream fs = new FileStream(newPath + @"\" + templateImageArray2[x].Split(' ')[0], FileMode.Create);
int ReadCount = imageResponseStream.Read(buffer, 0, buffer.Length);
while (ReadCount > 0)
{
fs.Write(buffer, 0, ReadCount);
ReadCount = imageResponseStream.Read(buffer, 0, buffer.Length);
}
fs.Close();
imageResponseStream.Close();
}
catch (WebException r)
{
if (r.Status == WebExceptionStatus.Timeout)
{
//Obtain more detail on error:
var response = (FtpWebResponse)r.Response;
FtpStatusCode errorCode = response.StatusCode;
string errorMessage = response.StatusDescription;
MessageBox.Show(errorMessage);
//goto RETRY;
}
MessageBox.Show(r.Message);
break;
}
string[] tempIDPText = new string[0];
Uri fileUriLocal = new Uri("ftp://srvrname:password@" + tempIpAddress + "/%2fROOT/DEVICE/HD/" + comboClass.Text + "/data/" + dirName1 + "/" + dirName2 + ".img");
//Open a web request based on the URI just built from user selections
FtpWebRequest requestLocal = (FtpWebRequest)WebRequest.Create(fileUriLocal);
requestLocal.UsePassive = false;
requestLocal.UseBinary = true;
requestLocal.KeepAlive = false;
//Act on that webrequest based on what the user wants to do (i.e. list a directory, list file, download, etc)
requestLocal.Method = WebRequestMethods.Ftp.DownloadFile;
try
{
//Now get the response from the tool as a stream.
FtpWebResponse responseLocal = (FtpWebResponse)requestLocal.GetResponse();
Stream responseStream = responseLocal.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
//Now read an individual file and fill the array with the chamber status
int y = 0;
while (!reader.EndOfStream)
{
if (reader.EndOfStream)
break;
else
{
Array.Resize(ref tempIDPText, tempIDPText.Length + 1);
tempIDPText[tempIDPText.Length - 1] = reader.ReadLine();
}
}
reader.Close();
responseStream.Close();
responseLocal.Close();
ServicePoint srvrPoint = ServicePointManager.FindServicePoint(fileUriLocal);
MethodInfo ReleaseConns = srvrPoint.GetType().GetMethod
("ReleaseAllConnectionGroups",
BindingFlags.Instance | BindingFlags.NonPublic);
ReleaseConns.Invoke(srvrPoint, null);
}
catch (WebException r)
{
//Obtain more detail on the error;
var response = (FtpWebResponse)r.Response;
FtpStatusCode errorCode = response.StatusCode;
string errorMessage = response.StatusDescription;
MessageBox.Show(errorCode.ToString());
MessageBox.Show("When getting file Dates: " + errorMessage.ToString());
}
return tempIDPText;
请尝试将UseAnsive设置为true。如果这没有帮助,请尝试通过IP地址而不是服务器名进行访问。可能名称无法正确解析。是的,按照@Sebi的建议执行。或者你有(非常好的)理由使用主动模式吗?被动模式。。。事实上,这已经解决了我以前的一些其他问题,但在这种情况下,它没有帮助。虽然建议很好,但我不知道为什么我没有想过尝试这个。至于服务器名引用,我实际上替换了服务器的真实名称和密码,以避免任何IP问题的提示。我在代码的其他部分使用了相同的FTP访问URI,效果很好。谢谢你的建议。我想我将把这一部分提取到它自己的项目中,使其更小,并确保只有这段代码导致了我的问题。搜寻继续:)。好的,我尝试使用被动模式(这在某些地方对我有帮助,我的McAfee认为我有端口扫描病毒:),但我使用主动模式以同样的方式访问相同的FTP服务器,没有问题。此外,它也没有帮助。请尝试将UseAssive设置为true。如果这没有帮助,请尝试通过IP地址而不是服务器名进行访问。可能名称无法正确解析。是的,按照@Sebi的建议执行。或者你有(非常好的)理由使用主动模式吗?被动模式。。。事实上,这已经解决了我以前的一些其他问题,但在这种情况下,它没有帮助。虽然建议很好,但我不知道为什么我没有想过尝试这个。至于服务器名引用,我实际上替换了服务器的真实名称和密码,以避免任何IP问题的提示。我在代码的其他部分使用了相同的FTP访问URI,效果很好。谢谢你的建议。我想我将把这一部分提取到它自己的项目中,使其更小,并确保只有这段代码导致了我的问题。搜寻继续:)。好的,我尝试使用被动模式(这在某些地方对我有帮助,我的McAfee认为我有端口扫描病毒:),但我使用主动模式以同样的方式访问相同的FTP服务器,没有问题。也没用。