.Net: FtpWebRequest "(503) Ошибка последовательности команд" ошибка - PullRequest
5 голосов
/ 31 октября 2008

На больших файлах (~ 200 + МБ) при чтении потока появляется ошибка 503.

ftp = (FtpWebRequest)WebRequest.Create(new Uri(address.AbsoluteUri + @"/" + file.Name));
ftp.Credentials = new NetworkCredential(username, password);
ftp.Method = WebRequestMethods.Ftp.DownloadFile;

response = (FtpWebResponse)ftp.GetResponse();

Есть какие-нибудь подсказки о том, что я делаю неправильно, или о лучшей практике для больших файлов?

Ответы [ 5 ]

4 голосов
/ 05 мая 2010

Я согласен, что минимизация количества объектов NetworkCredential решает проблему. Я столкнулся с этой проблемой и создал один CredentialCache и добавил каждый учетные данные один раз. Больше нет ошибок ftp.

4 голосов
/ 05 ноября 2008

Получаете ли вы 503 после каждой попытки или только после последующих?

Вы пробовали установить отключение KeepAlive?

ftp.KeepAlive = false;

Я бы попробовал более чистую клиентскую библиотеку ftp, базовую бесплатную можно получить по адресу sourceforge .

3 голосов
/ 09 марта 2010

По некоторым причинам, некоторые люди, похоже, заметили некоторый успех с использованием только одного экземпляра объекта NetworkCredential вместо использования нового для каждого FtpWebRequest. Это сработало для меня, по крайней мере.

0 голосов
/ 07 сентября 2016

В моем случае сервер (принадлежащий клиенту) был изменен, чтобы принимать только запросы TLS (SSL). Они, конечно, не сказали нам об этом, и сообщение об ошибке 503 не помогло!

Итак, нам нужно было использовать .EnableSsl так:

        var ftp = WebRequest.Create(uri) as FtpWebRequest;
        if (ftp != null) {
            ftp.EnableSsl = true; // <- the new bit
            ftp.Credentials = myCredentials;
            ftp.KeepAlive = false; // <- you may or may not want this
        }
        return ftp;

Чтобы игнорировать ошибки сертификата, мне также нужно было добавить это:

System.Net.ServicePointManager.ServerCertificateValidationCallback +=
                (sender, certificate, chain, sslPolicyErrors) => true;

Насколько я понимаю, эта строка имеет глобальный эффект, поэтому просто нужно вызвать ее при запуске приложения.

: о)

0 голосов
/ 18 февраля 2014

Ошибка из-за того, что сервер не может выйти из системы. Используйте оператор try, и когда эта ошибка возникнет, создайте небольшую задержку и запустите ее заново. Это позволит серверу выйти из последнего запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...