FTP бросает WebException только в .NET 4.0 - PullRequest
2 голосов
/ 05 января 2011

У меня следующий код c #.Он прекрасно работает при компиляции с .NET Framework 3.5 или 2.0 (я не тестировал его с 3.0, но, скорее всего, он тоже будет работать).Проблема заключается в том, что происходит сбой при сборке на основе .NET Framework 4.0.

        FtpWebRequest Ftp = (FtpWebRequest)FtpWebRequest.Create(Url_ + '/' + e.Name);

        Ftp.Method = WebRequestMethods.Ftp.UploadFile;
        Ftp.Credentials = new NetworkCredential(Login_, Password_);
        Ftp.UseBinary = true;
        Ftp.KeepAlive = false;
        Ftp.UsePassive = true;

        Stream S = Ftp.GetRequestStream();

        byte[] Content = null;
        bool Continue = false;
        do
        {
            try
            {
                Continue = false;
                Content = File.ReadAllBytes(e.FullPath);
            }
            catch (Exception)
            {
                Continue = true;
                System.Threading.Thread.Sleep(500);
            }
        } while (Continue);

        S.Write(Content, 0, Content.Length);
        S.Close();

        FtpWebResponse Resp = (FtpWebResponse)Ftp.GetResponse();
        if (Resp.StatusCode != FtpStatusCode.CommandOK)
            Console.WriteLine(Resp.StatusDescription);

Проблема заключается в вызове Stream S = Ftp.GetRequestStream (); , который создает экземпляр enWebException с сообщением «Удаленный сервер возвратил ошибку: (500) Синтаксическая ошибка, команда не распознана».

Кто-нибудь знает, почему это так?

PS.Я общаюсь с виртуальным ftp-сервером в ECM Alfresco.

edit: Я недавно узнал, что на Windows 7 невозможно иметь службу Windows .NET Framework 3.5, поэтому было бы неплохо решить эту проблему.Что мне нужно сделать, это загрузить файл в ftp - есть ли другой (работающий) способ в c #?

edit2: предыдущее редактирование не соответствует действительности, я несколько запутался ...

Ответы [ 2 ]

4 голосов
/ 05 января 2011

Я нашел похожий пост здесь http://bytes.com/topic/net/answers/792209-problems-ftpwebrequest-getrequeststream-c

с разрешением, которое работает для этого человека.

попробуйте это:

изменить

reqFTP.UsePassive = true;

до

reqFTP.UsePassive = false;

UsePassive: указывает, использовать ли активный или пассивный режим. Ранее активный FTP работал нормально с все клиенты, но сейчас, как и большинство случайные порты заблокированы брандмауэр, активный режим может не работать. Пассивный FTP полезен в этом дело. Но тем не менее, это вызывает проблемы в сервер. Запрошенные порты выше клиентом на сервере также может быть заблокирован брандмауэром. Но потому что FTP-серверы должны будут сделать их серверы доступны для величайших количество клиентов, они будут почти конечно нужно поддерживать пассивный FTP. Пассивный режим считается безопасным потому что это обеспечивает весь поток данных инициация приходит изнутри (клиент) сеть, а не из снаружи (сервер).

Кроме того, согласно документации MSDN на http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.usepassive.aspx

Если для UsePassive установлено значение true, FTP сервер не может отправить размер файл, и прогресс загрузки всегда можно быть ноль. Если UsePassive установлен в false, брандмауэр может поднять предупреждение и заблокировать загрузку файла.

0 голосов
/ 27 мая 2014

У меня была похожая проблема. Я использую FTP.Net 2.0, и мое приложение скомпилировано с целью FW4.0 Я решил это, добавив свойство в файл app.config:

<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>

Дополнительная информация здесь: Какая «дополнительная конфигурация» необходима для ссылки на сборку смешанного режима .NET 2.0 в проекте .NET 4.0?

...