Ошибка 550 файла недоступна при загрузке файла класса FtpWebRequest. Прекрасно работает в FileZilla

Я искал и нашел другие вопросы по этому вопросу, но никто не решил мои проблемы. Я пытаюсь загрузить файл через FTP, используя образец кода MSDN. Я получаю Удаленный сервер возвратил ошибку: (550) Файл недоступен (например, файл не найден, нет доступа) в этой строке: ftpstream.Close ();

    string inputfilepath = @"C:\DWF\test.txt";
    string ftpfilepath = "/abc/def/hij/klm/nop/test.txt";
    string ftphost = "my-ser-ver1:2121";
    //here correct hostname or IP of the ftp server to be given  

    string ftpfullpath = "ftp://" + ftphost + ftpfilepath;
    FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(ftpfullpath);
    ftp.Credentials = new NetworkCredential("user", "pass");
    //userid and password for the ftp server to given  

    ftp.KeepAlive = true;
    ftp.UseBinary = true;

    ftp.Method = WebRequestMethods.Ftp.UploadFile;
    FileStream fs = File.OpenRead(inputfilepath);
    byte[] buffer = new byte[fs.Length];
    fs.Read(buffer, 0, buffer.Length);
    fs.Close();
    Stream ftpstream = ftp.GetRequestStream();
    ftpstream.Write(buffer, 0, buffer.Length);
    ftpstream.Close(); 

Я дважды проверил 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.)
 Rowland Shaw09 мар. 2012 г., 13:46
Вы пересекаете какие-либо прокси?

Ответы на вопрос(4)

Решение Вопроса

поведение команды CWD изменилось при переходе с .NET 3.5 на 4.0.

Вы должны сначала вызвать метод по этой ссылке.

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

 JamieSee30 апр. 2014 г., 23:03
@Steen Я только что добавил для вас ответ, который содержит PowerShell, эквивалентный коду из базы знаний SteveCalPoly.
 devlord05 сент. 2012 г., 02:08
Что если вы используете powershell вместо C # и, следовательно, копировать и вставлять эту функцию на самом деле невозможно?
 Steen17 сент. 2012 г., 13:36
Просто бросил +1 по-своему. Было недавно обновленное приложение, которое действовало на загрузках, а не на загрузках ..... Однако, после выполнения в соответствии с инструкциями все хорошо ...

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

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

эквивалентный коду в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)
    }
}

но, скорее всего, где-то на вашем пути отсутствует каталог. Если вы используете какие-либо нестандартные символы в пути к файлу 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;
        }
    }

Ваш ответ на вопрос