Установите FtpWebRequest через HTTP-прокси, используя метод CONNECT
Я пытаюсь установить FTP-соединение, используя FtpWebRequest
, Мне нужно установить соединение через прокси-сервер squid, который требует от меня CONNECT
Команда первая.
Я пробовал код ниже, но это приводит к GET
запрос к прокси серверу, от которого он отказывается.
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://" +server);
request.Credentials = new NetworkCredential(user, pwd);
var webproxy = new WebProxy(new Uri("http://" + proxy+ ":" + proxyPort));
webproxy.UseDefaultCredentials = true;
request.Proxy = webproxy;
request.UsePassive = true;
request.Method = WebRequestMethods.Ftp.ListDirectory;
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Есть ли способ, которым я могу использовать FtpWebRequest
установить соединение через прокси?
Если нет, знаете ли вы хороший и, надеюсь, бесплатный FTP-клиент.NET, который я могу использовать? Большое спасибо за Вашу помощь.
2 ответа
FtpWebRequest - это клиент без сессий, поэтому он не позволяет вам взаимодействовать с удаленным концом во время соединения. Я изучил код FtpWebRequest.cs и не вижу, как можно заставить его отправить команду "ПОДКЛЮЧИТЬ".
Команда "CONNECT" не является частью стандартного набора команд FTP, поэтому я не могу понять, как это вписывается в то, что должна делать библиотека FTP.
Хороший бесплатный FTP-клиент, ориентированный на сеанс, который я использую, - это "Библиотека SSH.NET" по адресу http://sshnet.codeplex.com/ но я считаю, что он поддерживает только sftp. FtpWebRequest поддерживает ftps и ftp. Узнайте, поддерживает ли ваш FTP-сервер sftp, и сможете ли вы использовать SSH.NET . Если ваш единственный вариант - ftps, я могу сообщить, что я потратил много времени на поиск бесплатного ftp-клиента.net и ушел, используя FtpWebRequest.
FtpWebRequest
поддерживает HTTP прокси (и CONNECT
команда является обязательной частью этой поддержки). Ваш код правильный.
Хотя HTTP-прокси не поддерживается загрузки (это для всех других операций). Поэтому, возможно, ваша настоящая проблема - загрузка, а вы об этом не упоминаете.
Для загрузки по FTP через HTTP-прокси вы должны использовать сторонний FTP-клиент.
Например, для сборки WinSCP .NET вы можете использовать:
// Setup session options
SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Ftp,
HostName = "example.com",
UserName = "user",
Password = "mypassword",
};
// Configure proxy
sessionOptions.AddRawSettings("ProxyMethod", "3"); // HTTP proxy
sessionOptions.AddRawSettings("ProxyHost", "proxy");
using (Session session = new Session())
{
// Connect
session.Open(sessionOptions);
// Upload file
string localFilePath = @"C:\path\file.txt";
string pathUpload = "/file.txt";
session.PutFiles(localFilePath, pathUpload).Check();
}
Для вариантов для SessionOptions.AddRawSettings
смотрите сырые настройки.
Проще всего, чтобы WinSCP GUI генерировал шаблон кода C# FTP для вас.
Обратите внимание, что сборка WinSCP .NET не является нативной библиотекой.NET. Это скорее тонкая оболочка.NET поверх консольного приложения.
(Я автор WinSCP)