Ошибка 550 файла недоступна при загрузке файла класса FtpWebRequest.Прекрасно работает в FileZilla - PullRequest
5 голосов
/ 08 марта 2012

Я искал и нашел другие вопросы по этому вопросу, но никто не решил мои проблемы.Я пытаюсь загрузить файл через FTP, используя образец кода MSDN.Я получаю: Удаленный сервер возвратил ошибку: (550) Ошибка файла недоступна (например, файл не найден, нет доступа):URI для пробелов и их нет.Я могу выполнить эту задачу, используя filezilla с тем же именем пользователя.Не существует каталога по умолчанию, который уже является частью моего URI.Одно можно сказать наверняка, что я подключаюсь к Unix-серверу, так что, может быть, мне не хватает настроек?

Редактировать # 1 (добавлен журнал ошибок из System.Net)

System.Net Information: 0 : [7584] FtpControlStream#62182359 - Received response [220 Oracle Content Services FTP Server ready.]

System.Net Information: 0 : [7584] FtpControlStream#62182359 - Sending command [USER myuser]

System.Net Information: 0 : [7584] FtpControlStream#62182359 - Received response [331 Password required for myuser.]

System.Net Information: 0 : [7584] FtpControlStream#62182359 - Sending command [PASS ********]

System.Net Information: 0 : [7584] FtpControlStream#62182359 - Received response [230 Login successful.]

System.Net Information: 0 : [7584] FtpControlStream#62182359 - Sending command [OPTS utf8 on]

System.Net Information: 0 : [7584] FtpControlStream#62182359 - Received response [500 Command not supported: OPTS]

System.Net Information: 0 : [7584] FtpControlStream#62182359 - Sending command [PWD]

System.Net Information: 0 : [7584] FtpControlStream#62182359 - Received response [257 "/"]

System.Net Information: 0 : [7584] FtpControlStream#62182359 - Sending command [TYPE I]

System.Net Information: 0 : [7584] FtpControlStream#62182359 - Received response [200 TYPE set to I.]

System.Net Information: 0 : [7584] FtpControlStream#62182359 - Sending command [PASV]

System.Net Information: 0 : [7584] FtpControlStream#62182359 - Received response [227 Entering Passive Mode (10,8,9,50,77,53)]

System.Net Information: 0 : [7584] FtpControlStream#62182359 - Sending command [STOR abc/def/hij/klm/nop/test.txt]

System.Net Information: 0 : [7584] FtpControlStream#62182359 - Received response [150 Ok to send data.]

System.Net Verbose: 0 : [7584] Exiting FtpWebRequest#10964107::GetRequestStream() 

System.Net Information: 0 : [7584] FtpControlStream#62182359 - Received response [550 Access denied.]

System.Net Information: 0 : [7584] FtpWebRequest#10964107::(Releasing FTP connection#62182359.)

Ответы [ 4 ]

6 голосов
/ 10 марта 2012

Это добилось цели.по-видимому, поведение команды CWD изменилось при переходе с .NET 3.5 на 4.0.

Сначала необходимо вызвать метод по этой ссылке.

http://support.microsoft.com/kb/2134299

2 голосов
/ 22 мая 2012

У меня была эта проблема совсем недавно. Это просто выскочило на код, который я использовал в течение многих лет. Оказалось, что я работал с несколькими ftp-сайтами и отправлял одинаковые файлы на все эти ftp-сайты. Ну, когда я зашел на некоторые ftp-сайты, меня оставили в корне, но в других я сразу же был помещен в подкаталог Перед этим недавним изменением я мог использовать поток запросов и поместить файл прямо в подпапку, куда меня положили. На прошлой неделе мне нужно было полностью определить путь.

Надеюсь, это кому-нибудь поможет .....

2 голосов
/ 08 марта 2012

Трудно сказать без подробной информации об ошибке, но, скорее всего, где-то на вашем пути отсутствует каталог. Если вы используете нестандартные символы в пути к файлу FTP, попробуйте использовать HttpUtility.UrlPathEncode перед его добавлением в URL.

Чтобы получить подробную информацию об устранении неполадок, я добавляю следующее в элемент конфигурации файла .config моего приложения:

<system.diagnostics>
  <sources>
    <source name="System.Net">
      <listeners>
        <add name="TraceFile"/>
      </listeners>
    </source>
    <source name="System.Net.Sockets" maxdatasize="1024">
      <listeners>
        <add name="TraceFile"/>
      </listeners>
    </source>
  </sources>
  <sharedListeners>
    <add name="TraceFile" type="System.Diagnostics.TextWriterTraceListener" initializeData="System.Net.trace.log" traceOutputOptions="DateTime"/>
  </sharedListeners>
  <switches>
    <add name="System.Net" value="Verbose"/>
    <!--<add name="System.Net.Sockets" value="Verbose"/>-->
  </switches>
  <trace autoflush="true" />
</system.diagnostics>

Также, просто для справки, вот код, который я использую для загрузки:

    private static FtpWebRequest CreateFtpWebRequest(string ftpUrl, string userName, string password, bool useSsl, bool allowInvalidCertificate, bool useActiveFtp)
    {
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpUrl);
        request.Credentials = new NetworkCredential(userName, password);

        if (useSsl)
        {
            request.EnableSsl = true;

            if (allowInvalidCertificate)
            {
                ServicePointManager.ServerCertificateValidationCallback = ServicePointManager_ServerCertificateValidationCallback;
            }
            else
            {
                ServicePointManager.ServerCertificateValidationCallback = null;
            }
        }

        request.UsePassive = !useActiveFtp;

        return request;
    }

    private static void UploadFileToServer(string ftpUrl, string userName, string password, bool useSsl, bool allowInvalidCertificate, bool useActiveFtp, string filePath)
    {
        FtpWebRequest request = CreateFtpWebRequest(ftpUrl, userName, password, useSsl, allowInvalidCertificate, useActiveFtp);

        request.Method = WebRequestMethods.Ftp.UploadFile;

        long bytesReceived = 0;
        long bytesSent = 0;

        using (Stream requestStream = request.GetRequestStream())
        using (FileStream uploadFileStream = File.OpenRead(filePath))
        {
            // Note that this method call requires .NET 4.0 or higher. If using an earlier version it will need to be replaced.
            uploadFileStream.CopyTo(requestStream);
            bytesSent = uploadFileStream.Position;
        }

        using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
        {
            bytesReceived = response.ContentLength;
        }
    }
0 голосов
/ 01 мая 2014

Этот ответ предназначен для Стин и содержит PowerShell, эквивалентный коду в http://support.microsoft.com/kb/2134299 ниже. У меня нет системы с несоответствующим поведением для тестирования, поэтому вам нужно попробовать ее самостоятельно.

function SetMethodRequiresCWD() {
    [Type] $requestType = [System.Net.FtpWebRequest]
    [System.Reflection.FieldInfo] $methodInfoField = $requestType.GetField("m_MethodInfo", [System.Reflection.BindingFlags]::NonPublic -bor [System.Reflection.BindingFlags]::Instance)
    [Type] $methodInfoType = $methodInfoField.FieldType


    [System.Reflection.FieldInfo] $knownMethodsField = $methodInfoType.GetField("KnownMethodInfo", [System.Reflection.BindingFlags]::Static -bor [System.Reflection.BindingFlags]::NonPublic)
    [Array] $knownMethodsArray = [Array]$knownMethodsField.GetValue($null);

    [System.Reflection.FieldInfo] $flagsField = $methodInfoType.GetField("Flags", [System.Reflection.BindingFlags]::NonPublic -bor [System.Reflection.BindingFlags]::Instance)

    [int] $MustChangeWorkingDirectoryToPath = 0x100
    ForEach ($knownMethod In $knownMethodsArray) {
        [int] $flags = [int]$flagsField.GetValue($knownMethod)
        $flags = $flags -bor $MustChangeWorkingDirectoryToPath
        $flagsField.SetValue($knownMethod, $flags)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...