Можно ли использовать C # FtpWebRequest через FTP-прокси? - PullRequest
3 голосов
/ 02 сентября 2010

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

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

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

Ответы [ 5 ]

3 голосов
/ 10 мая 2012

Вот код, который я использовал ранее, я должен предупредить, что я проверял это только на брандмауэре 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");
1 голос
/ 07 апреля 2017

Если прокси-сервер 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 GUI и получить генерировать C # FTPшаблон кода для вас.

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

(я автор WinSCP)

1 голос
/ 05 ноября 2011

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

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

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

username="ftpUserName@ftp.realserver.com" 

и

password="password". 

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

1 голос
/ 02 сентября 2010

Если у вас есть на это бюджет - Дарт сделает несколько отличных уроков для этого:

http://www.dart.com/ или конкретно http://www.dart.com/ptftpnet.aspx

0 голосов
/ 26 октября 2010

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

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

, гдеapplicationName - это исполняемый exe минус расширение .exe.

...