FTP错误:530对不起,每个主机仅允许5个连接

问题描述 投票:0回答:1

我有一个效果很好的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个连接我已经用谷歌搜索了这个问题,但是......>

c# ftp
1个回答
1
投票

仅每2秒一次呼叫的最大吞吐量不会阻止外部线程调用5个以上的连接。试想一下,您与服务器的连接暂时会很慢,否则您请求的列表将很长。下载所需的时间可能比平时多(假设出于某种原因,这将花费15秒)。因为需要更多时间才能完成,您最终将达到5个并发连接的上限并收到错误消息,因为您将在先前的下载结束之前发起新的呼叫。

您可以使用SemaphoreSlim来“排队”对方法SemaphoreSlim的所有调用。这样可以确保您的线程执行的并发调用不超过5个。当一个呼叫结束时,信号量将释放一个点,而另一个呼叫将开始。

© www.soinside.com 2019 - 2024. All rights reserved.