(530) извините, только 5 соединений на хост разрешены в FtpWebRequest - PullRequest
0 голосов
/ 10 ноября 2019

У меня проблема, когда я проверяю, существуют ли каталоги (если они не создаются) на сервере.

Приведенный ниже код работает нормально. Проблема заключается в том, что после создания 4 каталогов, я получаю это сообщение об ошибке:
530 извините, только 5 подключений на хост разрешено

Это кажется правильным, потому что я получаю сообщение об ошибкеMessageBox в методе "DoesFtpDirectoryExist" после 4 каталогов.

Однако я задал вопрос перед тем, что имя пользователя / пароль следует кэшировать в ServicePointManager с помощьюто же самое «request.ConnectionGroupName», которое я делаю, которое должно препятствовать открытию НОВОГО соединения, так как оно уже кэшировано.

Но все же, похоже, оно открывает НОВЫЕ соединения. Что я могу делать не так?
Следует упомянуть, что все папки уже существуют на сервере, поэтому здесь работает только "DoesFtpDirectoryExist" .

        void createcheckifExistDirectories()
        {
            List<String> directoriesToCheckLIST = new List<String>();
            for (int i = 0; i < 30; i++) { directoriesToCheckLIST.Add("folder" + i); }
            for (int i = 0; i < directoriesToCheckLIST.Count; i++)
            {
                String folderpath = directoriesToCheckLIST[i];
                Task<bool> task = ftpCreateDirectory("ftp://somehost.com", folderpath, "user", "password");
                if (task.IsFaulted == false)
                {
                     //Folder exist
                }
                else { /*Folder not exist*/ }
                Thread.Sleep(2000); //Not so fast
            }
        }
        public async Task<bool> ftpCreateDirectory(String host, String folderpath, String user_name, String password)
        {
            System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
            bool returnvalue = false;
            try
            {
                bool dirExists = DoesFtpDirectoryExist(host, folderpath, user_name, password);
                if (dirExists == false)
                {
                    Thread.Sleep(2000);
                    var request = (FtpWebRequest)WebRequest.Create(host + "/" + folderpath); //"ftp://f16-preview.runhosting.com/PanoramaTEST2/UploadedToChristian"
                    request.Credentials = new NetworkCredential(user_name, password);
                    request.Method = WebRequestMethods.Ftp.MakeDirectory;
                    request.ConnectionGroupName = host.Replace(".", "").Replace(":", "").Replace("/", "").Replace("-", "").Replace("_", "") + user_name;
                    request.ServicePoint.ConnectionLimit = 4;

                    using (var responseWeb = await request.GetResponseAsync())
                    {
                        var response = (FtpWebResponse)responseWeb;
                        if (response.StatusDescription.Contains("257")) //257 Directory successfully created
                        {
                            returnvalue = true;
                        }
                    }
                }
                else { returnvalue = true; }
            }
            catch (WebException ex) { String status = ((FtpWebResponse)ex.Response).StatusDescription; }
            return returnvalue;
        }
        public bool DoesFtpDirectoryExist(String host, String folderpath, String user_name, String password)
        {
            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;
                FtpWebResponse response = (FtpWebResponse)request.GetResponse();
                return true;
            }
            catch (WebException ex) { String status = ((FtpWebResponse)ex.Response).StatusDescription; MessageBox.Show(status.ToString()); return false; }
        }
...