Можно ли использовать C# FtpWebRequest через FTP-прокси?

Насколько я понимаю, свойство FtpWebRequest.Proxy обозначает HTTP-прокси. Мне нужно отправлять FTP-запросы на внешний сервер через FTP-прокси.

Единственный способ заставить это работать до сих пор — создать скрипт, который использует команду Windows FTP и загрузить таким образом.

Можно ли использовать FtpWebRequest для загрузки файлов через FTP-прокси?


person Joel Goodwin    schedule 02.09.2010    source источник


Ответы (5)


Если у вас есть на это бюджет — Dart сделает для этого несколько отличных занятий:

http://www.dart.com/ или, в частности, http://www.dart.com/ptftpnet.aspx

person Dave Hogan    schedule 02.09.2010
comment
Я не уверен, что смогу его раскачать, но это выглядит как достойное решение. Чтение их сайта также предполагает, что просто невозможно использовать FTP-прокси с тем, что предоставляется в .NET CLR. - person Joel Goodwin; 02.09.2010

Вот код, который я использовал раньше, я должен предостеречь, что тестировал его только на брандмауэре Checkpoint, поэтому команды формата USER и PASS могут отличаться для вашего FTP-прокси. Ваш системный администратор знает правильный формат.

FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(
       new Uri("ftp://FTP PROXY HOST/actual/path/to/file/on/remote/ftp/server"));
reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
reqFTP.UseBinary = true;

reqFTP.Credentials = new NetworkCredential
       ("REMOTE FTP USER@FTP PROXY USER@REMOTE FTP HOST"
       , "REMOTE FTP PASSWORD@FTP PROXY PASSWORD");
person booyaa    schedule 10.05.2012

Я знаю, что срок уже давно истек, но да, я могу заставить FtpWebRequest работать с ftp-прокси, используя старые приемы установки URL-адреса на

"ftp://your.proxy.server/theFileToDownload")" 

Затем установите свои сетевые учетные данные на

username="[email protected]" 

и

password="password". 

Я вспомнил, как делал это в старые недобрые дни WININET, и иногда старые приемы все еще остаются лучшими приемами.

YMMV, конечно.

person mezmo    schedule 04.11.2011

Если FTP-прокси позволяет указать всю информацию о цели с помощью команд USER и PASS, вы можете использовать веб-запрос Credentials свойство.

Обычно вы указываете имя пользователя в форме user@proxyuser@host и пароль в форме password@proxypassword:

FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://proxy/path");
request.Credentials = new NetworkCredential("user@proxyuser@host", "password@proxypassword");

Если прокси не требует аутентификации, используйте форму user@host и password:

FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://proxy/path");
request.Credentials = new NetworkCredential("user@host", "password");

Но вашему прокси-серверу также может потребоваться другой синтаксис, например:

  • отдельные USER команды для пользователя прокси и целевого пользователя хоста
  • OPEN команда
  • SITE команда

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

Например, с сборкой WinSCP .NET вы можете использовать:

// Setup session options
SessionOptions sessionOptions = new SessionOptions
{
    Protocol = Protocol.Ftp,
    HostName = "host",
    UserName = "user",
    Password = "password",
};

// Configure proxy
sessionOptions.AddRawSettings("ProxyHost", "proxy");
sessionOptions.AddRawSettings("FtpProxyLogonType", "2");
sessionOptions.AddRawSettings("ProxyUsername", "proxyuser");
sessionOptions.AddRawSettings("ProxyPassword", "proxypassword");

using (Session session = new Session())
{
    // Connect
    session.Open(sessionOptions);

    // Your code
}

Параметры для SessionOptions.AddRawSettings см. в необработанные настройки.

Проще настроить параметры прокси-сервера в графическом интерфейсе WinSCP и использовать сгенерировать шаблон кода FTP C# для вас.

Обратите внимание, что сборка WinSCP .NET не является собственной библиотекой .NET. Это скорее тонкая оболочка .NET над консольным приложением.

(я автор WinSCP)

person Martin Prikryl    schedule 07.04.2017

Они утверждают, что можно перечислить, перечислить детали и загрузить через прокси. Однако я не мог заставить это работать с брандмауэром isa. Поэтому я отключил прокси-сервер по умолчанию в своем app.config и добавил правило приложения для клиента ForeFront/ISA. Для этого я создал файл c:\programdata\microsoft\firewall client 2004\application.ini с содержимым:

[applicationName] DisableEx=0 Disable=0 NameResolution=R

где applicationName — исполняемый файл без расширения .exe.

person csaam    schedule 26.10.2010
comment
Я считаю, что это относится к HTTP-прокси, а не к FTP-прокси. - person Joel Goodwin; 26.10.2010