Я просто протестировал это на одном из наших серверов-разработчиков и действительно есть 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! = "/".
В двух словах, к сожалению, вы не можете переопределить это поведение, потому что оно сжигается в источнике.