我有一个效果很好的FTP解决方案。但是过了一会儿,经过20到30分钟,我会收到以下错误消息:530对不起,每个主机仅允许5个连接
我已经用谷歌搜索了这个问题,但没有找到任何解决方案。我有不同的线程调用该函数,但仅允许每2秒调用一次该函数。我正在使用:using语句,但我想我不想使用:
request.KeepAlive = false;
确保连接将关闭。正如我之前被告知要在“ ServicePoint”中将其打开一样,因为我使用“ ConnectionGroupName”是因为打开新连接会占用大量资源,并且保持打开状态更为顺畅。
我认为但不确定。请告诉我这是否是一个不好的方法。但是当发生此错误时。我喜欢关闭所有连接,在这种情况下,关闭5个连接,以便从零连接开始。因为我不确定如何在代码中调用这些连接,所以这有可能做到,我将如何在代码中做到这一点?
public async Task<List<String>> FtpGetFiles(String host, String folderpath, String user_name, String password)
{
List<String> serverfileLIST = new List<String>(); String error = "";
try
{
var request = (FtpWebRequest)WebRequest.Create(host + "/" + folderpath + "/");
request.Credentials = new NetworkCredential(user_name, password);
request.Method = WebRequestMethods.Ftp.ListDirectory;
request.ConnectionGroupName = host.Replace(".", "").Replace(":", "").Replace("/", "").Replace("-", "").Replace("_", "") + user_name;
request.ServicePoint.ConnectionLimit = 4;
request.Timeout = 20000;
using (var responseWeb = await request.GetResponseAsync())
{
var response = (FtpWebResponse)responseWeb;
if (response.StatusDescription.Contains("150") || //150 opening binary mode data connection for file list
response.StatusDescription.Contains("226"))
{
using (StreamReader streamReader = new StreamReader(response.GetResponseStream()))
{
while (streamReader.Peek() >= 0)
{
serverfileLIST.Add(streamReader.ReadLine());
}
}
return serverfileLIST;
}
else { error = response.StatusDescription; }
}
}
catch (WebException ex) { String status = ((FtpWebResponse)ex.Response).StatusDescription; error = status; }
return serverfileLIST;
}
编辑:我已经附上了network.txt文件。我可以在自己的日志文件中看到,此时GMT,出现以下错误:2019年12月9日16:09:40 530对不起,每个主机仅允许5个连接2019年12月9日16:09:42 530对不起,每台主机仅允许5个连接]]
network.txt文件在下面的链接中也附有GMT,我想知道是否有可能跟踪问题所在以及如何解决?network.txt
我可以在txt文件中找到发生这些行的地方:
System.Net信息:0:[14868] FtpControlStream#13919402-发送命令[PASS ********]System.Net信息:0:[14868] FtpControlStream#13919402-收到的响应[530对不起,每个主机仅允许5个连接]System.Net信息:0:[14868] FtpWebRequest#45677341 :: :(释放FTP连接#13919402。)System.Net错误:0:[14868] FtpWebRequest#45677341 :: EndGetResponse中的异常-远程服务器返回错误:(530)未登录。在System.Net.FtpWebRequest.EndGetResponse(IAsyncResult asyncResult)我有一个效果很好的FTP解决方案。但是过了一会儿,发现了20-30分钟,我得到了这个错误:530对不起,每个主机只允许5个连接我已经用谷歌搜索了这个问题,但是......>
仅每2秒一次呼叫的最大吞吐量不会阻止外部线程调用5个以上的连接。试想一下,您与服务器的连接暂时会很慢,否则您请求的列表将很长。下载所需的时间可能比平时多(假设出于某种原因,这将花费15秒)。因为需要更多时间才能完成,您最终将达到5个并发连接的上限并收到错误消息,因为您将在先前的下载结束之前发起新的呼叫。
您可以使用SemaphoreSlim
来“排队”对方法SemaphoreSlim
的所有调用。这样可以确保您的线程执行的并发调用不超过5个。当一个呼叫结束时,信号量将释放一个点,而另一个呼叫将开始。