C # FTP с отключенным CD

Я пытаюсь получить следующий код: < string url = String . Формат ( @ "SOMEURL" ); string user = "SOMEUSER" ; string password = "SOMEPASSWORD" ; FtpWebRequest ftpclientRequest = ( FtpWebRequest ) WebRequest . Создать ( новый Uri ( url )); ftpclientRequest . Метод = WebRequestMethods . Ftp . ListDirectory ; ftpclientRequest . UsePassive = true ; ftpclientRequest . Proxy = null ; ftpclientRequest . Credentials = новый NetworkCredential ( пользователь , пароль ); FtpWebResponse ответ = ftpclientRequest . GetResponse () как FtpWebResponse ; р>

if (m_PreviousServerPath != newServerPath) { 
    if (!m_IsRootPath
        && m_LoginState == FtpLoginState.LoggedIn
        && m_LoginDirectory != null)
    { 
        newServerPath = m_LoginDirectory+newServerPath;
    } 
    m_NewServerPath = newServerPath; 

    commandList.Add(new PipelineEntry(FormatFtpCommand("CWD", newServerPath), PipelineEntryFlags.UserCommand)); 
}

Обычно это работает, но для одного конкретного сервера это дает ошибку 500: Синтаксис не распознается. Команда «Изменить каталог» отключена на проблемном сервере, и администратор сайта сказал мне, что .NET выдает команду «Изменить каталог» по умолчанию со всеми FTP-соединениями. Это правда? Есть ли способ отключить это?
EDIT: Когда я вхожу из командной строки, я попал в правильный каталог:
ftp> pwd
257 "/" - текущий каталог

c#,ftp,

6

Ответов: 5


11 принят

Я просто протестировал это на одном из наших серверов-разработчиков и действительно есть CWD, выпущенный .NET FtpWebRequest:

новое соединение от 172.16.3.210 по 172.16.3.210:21 (Явный SSL)
имя хоста разрешено: devpc
отправка приветствуется сообщение.
220 Gene6 FTP Server v3.10.0 (Build 2) готов ...
Тестер пользователя USER
testuser, 331 Пароль, необходимый для тестировщика.
testuser, PASS ****
testuser, зарегистрированный как «testuser».
testuser, 230 User testuser вошел в систему.
testuser, OPTS utf8 on
testuser, 501 Пожалуйста, сначала CLNT.
испытатель, PWD
testuser, 257 "/" - текущий каталог.
testuser, CWD /
testuser, каталог изменений '/' -> 'D:  testfolder' -> Доступ разрешен.
testuser, 250 CWD успешно. «/» - текущий каталог.
testuser, ТИП I
testuser, 200 Тип установлен на I.
испытатель, ПОРТ 172,16,3,210,4,127
testuser, 200 Port успешно.
testuser, NLST
testuser, 150 Открытие соединения данных для списка каталогов.
testuser, 226 Перевод ok.
testuser, 421 Соединение закрыто, время ожидания.
testuser, отключен. (00d00: 05: 01)

Это было даже без указания «/» в uri при создании объекта FtpWebRequest.

Если вы отлаживаете или просматриваете исходный код, вступает в игру класс под названием «FtpControlStream». См. Стек вызовов:

System.dll! System.Net.FtpControlStream.BuildCommandsList (System.Net.WebRequest req) Строка 555 C #
System.dll! System.Net.CommandStream.SubmitRequest (запрос System.Net.WebRequest = 
    {System.Net.FtpWebRequest}, bool async = false, bool readInitalResponseOnConnect = true) Строка 143 C #
System.dll! System.Net.FtpWebRequest.TimedSubmitRequestHelper (bool async) Строка 1122 + 0x13 байт C #
System.dll! System.Net.FtpWebRequest.SubmitRequest (bool async = false) Строка 1042 + 0xc байты C #
System.dll! System.Net.FtpWebRequest.GetResponse () Линия 649 C #

Существует метод с именем BuildCommandsList (), который вызывается. BuildCommandsList () создает список команд для отправки на FTP-сервер. Этот метод имеет следующий фрагмент кода:

ftp://server/path

При первом подключении к серверу m_PreviousServerPath всегда равно null, значение newServerPath равно «/» и вычисляется с помощью функции GetPathAndFileName () (вызывается несколько строк до этого блока кода). GetPathAndFileName () вычисляет newServerPath как «/», если не указан путь или если «/» явно привязана к концу «ftp: // ....» uri.

Таким образом, это, конечно, в конечном итоге приводит к добавлению команды CWD в конвейер команд, потому что null! = "/".

В двух словах, к сожалению, вы не можете переопределить это поведение, потому что оно сжигается в источнике.


1

Хотя пост, как давно ... неважно, я дам ответ здесь.

Вместо того, чтобы использовать ftp://server/%2fpath/как uri, попробуйте %2f.

Добавленный /«просто сбежал /, добавив, что это сделает C # трактовкой всего пути как абсолютного. Или C # будет входить в систему ftp://server/с именем пользователя, перейти в домашнюю папку пользователя, затем cd к указанному пути, поэтому ваш путь станет user_home_path/path, может быть нежелательным.

Дополнительная информация может быть найдена в msdn http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.aspx

Надеюсь это поможет.


0

Я думаю, что у нас была аналогичная проблема, но я не помню точных подробностей.

Чтобы предотвратить .net от выдачи команды cd, посмотрите, задаете ли вы каталог по умолчанию для пользователя, в котором вы входите, как указано в каталоге, в котором вы хотите работать. Вы можете просто использовать ftp-клиент командной строки, чтобы проверить это.


0

Вот решение: используйте эту бесплатную, с открытым исходным кодом, FTP-клиентскую библиотеку для C #, созданную Dan на C-SharpCorner.com: http://www.c-sharpcorner.com/uploadfile/danglass/ftpclient12062005053849am/ftpclient.aspx

Вот пример кода для загрузки файла:

FtpClient ftp = new FtpClient(FtpServer,FtpUserName,FtpPassword);
ftp.Login();
ftp.Upload(@"C:image.jpg");
ftp.Close(); 

Эта библиотека прекрасно работает, но ее также можно легко расширить и изменить.


0

Используя информацию выше, это сработало для меня.

Отправляет CWD - ftpState.ftpRequest = GetRequest (" ftp://192.168.0.2/tmp/file2download ")

Не отправляет CWD - ftpState.ftpRequest = GetRequest (« ftp://192.168.0.2//tmp/file2download ») уведомляет // после IP- адреса сервера (или имени)

Версия DotNET 2.0

Private Function GetRequest(ByVal URI As String) As FtpWebRequest
    'create request
    Dim result As FtpWebRequest = CType(FtpWebRequest.Create(URI), FtpWebRequest)
    Return result
End Function
C #, FTP,
Похожие вопросы
Яндекс.Метрика