Программа зависает на FtpWebResponse - PullRequest
6 голосов
/ 01 июня 2011

Первый постер, давний читатель.У меня действительно раздражающая проблема, которая действует мне на нервы.У меня есть настроенная программа, поэтому я слушаю новые файлы на FTP-сервере, если есть новый файл, я загружаю его.Оттуда я работаю с некоторой информацией в файле и т. Д. Моя проблема возникает, когда я повторяю последовательность во второй раз.То есть, с первым файлом, который я загружаю, все в порядке, но как только новый файл обнаруживается и моя программа пытается загрузить его, моя программа просто зависает.

 private static void DownloadFile(string s)
    {
        try
        {
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://blabla.com/"+s);
            request.Method = WebRequestMethods.Ftp.DownloadFile;
            request.Credentials = new NetworkCredential("xxx" ,"zzz");

            using (FtpWebResponse partResponse = (FtpWebResponse)request.GetResponse())
            {
                Stream partReader = partResponse.GetResponseStream();

                byte[] buffer = new byte[1024];
                FileInfo fi = new FileInfo(path);
                FileStream memStream = fi.Create();
                while (true)
                {
                    int bytesRead = partReader.Read(buffer, 0, buffer.Length - 1);
                    if (bytesRead == 0)
                        break;

                    memStream.Write(buffer, 0, bytesRead);
                }
                partResponse.Close();
                memStream.Close();
            }
            Console.WriteLine(DateTime.Now + " file downloaded");
            MoveFileToInProgress(s);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }

Строка, на которой он висит, -вот это: использование (FtpWebResponse partResponse = (FtpWebResponse) request.GetResponse ())

Причина, по которой мой метод здесь статический, заключается в том, что я просто запускаю его в другом проекте для его проверки .. Мой вопрос здесьпочему он умирает только на втором файле?Я часами смотрю на себя вслепую!

Ответы [ 2 ]

3 голосов
/ 11 ноября 2014

Я тоже столкнулся с этой проблемой ... попробуйте сначала завершить запрос, а затем закрыть его, прежде чем пытаться получить ответ. Это сработало для меня (на самом деле попробовал это после прочтения комментария MartinNielsen). Вот что я сделал.

        // connect to the ftp site
        FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(ftpUri);
        ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
        ftpRequest.Credentials = new NetworkCredential(ftpUser, ftpPassword);

        // setting proxy to null so that it does not go through the proxy
        ftpRequest.Proxy = null;

        // get file information
        StreamReader fileStream = new StreamReader(filePath);
        byte[] fileBytes = Encoding.UTF8.GetBytes(fileStream.ReadToEnd());
        ftpRequest.ContentLength = fileBytes.Length;
        fileStream.Close();

        // open connection to ftp site
        Stream ftpRequestStream = ftpRequest.GetRequestStream();

        // write the file to the stream
        ftpRequestStream.Write(fileBytes, 0, fileBytes.Length);

        // close the stream
        ftpRequestStream.Close();

        // get the response from the server
        FtpWebResponse ftpUploadResponse = (FtpWebResponse)ftpRequest.GetResponse();
        string result = ftpUploadResponse.StatusDescription;

        // close response
        ftpUploadResponse.Close();

        // return response to calling code
        return result;

Вот несколько ресурсов, которые я использовал при написании этого кода (не позволит мне публиковать более 2, их было больше)

Как загружать файлы с FTP

Загрузка файла - «Запрошенный URI недействителен для этой команды FTP»

0 голосов
/ 01 июня 2011

Я не эксперт по C #, но я использую этот код для загрузки файлов с моего ftp:

public void Download(string filename)
    {
        // I try to download five times before crash
        for (int i = 1; i < 5; i++)
        {
            try
            {
                FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(Global.Path + "/" + filename);
                ftp.Credentials = new NetworkCredential(User, Pass);
                ftp.KeepAlive = false;
                ftp.Method = WebRequestMethods.Ftp.DownloadFile;
                ftp.UseBinary = true;
                ftp.Proxy = null;

                int buffLength = 2048;
                byte[] buff = new byte[buffLength];
                int contentLen;

                string LocalDirectory = Application.StartupPath.ToString() + "/downloads/" + filename;
                using (FileStream fs = new FileStream(LocalDirectory, FileMode.Create, FileAccess.Write, FileShare.None))
                using (Stream strm = ftp.GetResponse().GetResponseStream())
                {
                    contentLen = strm.Read(buff, 0, buffLength);
                    while (contentLen != 0)
                    {
                        fs.Write(buff, 0, contentLen);
                        contentLen = strm.Read(buff, 0, buffLength);
                    }
                }

                Process.Start(LocalDirectory);
                break;
            }
            catch (Exception exc)
            {
                if (i == 5)
                {
                    MessageBox.Show("Can't download, try number: " + i + "/5 \n\n Error: " + exc.Message,
                        "Problem downloading the file");
                }
            }
        }
    }

Скажите, работает ли он для вас:)

...