Установите 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)

Другие вопросы по тегам