FTPS (FTP через SSL) в С#

Мне нужно руководство. Мне нужно разработать настраиваемый FTP в С#, который должен быть настроен с использованием файла App.Config. Кроме того, FTP должен выталкивать данные на любой сервер с любого клиента, снова зависит от файла конфигурации.

Я буду признателен, если кто-то может руководствоваться, если есть какой-либо API или любое другое полезное предложение, или переместите меня в правильном направлении.

Ответ 1

Вы можете использовать FtpWebRequest; однако это довольно низкий уровень. Существует класс более высокого уровня WebClient, для которого требуется гораздо меньше кода для многих сценариев; однако он по умолчанию не поддерживает FTP/SSL. К счастью, вы можете сделать WebClient работу с FTP/SSL, зарегистрировав собственный префикс:

private void RegisterFtps()
{
    WebRequest.RegisterPrefix("ftps", new FtpsWebRequestCreator());
}

private sealed class FtpsWebRequestCreator : IWebRequestCreate
{
    public WebRequest Create(Uri uri)
    {
        FtpWebRequest webRequest = (FtpWebRequest)WebRequest.Create(uri.AbsoluteUri.Remove(3, 1)); // Removes the "s" in "ftps://".
        webRequest.EnableSsl = true;
        return webRequest;
    }
}

Как только вы сделаете это, вы можете использовать WebClient почти как обычно, за исключением того, что ваши URI начинаются с "ftps://" вместо "ftp://". Одно из предостережений заключается в том, что вам нужно указать параметр method, поскольку его не будет по умолчанию. Например.

using (var webClient = new WebClient()) {
    // Note here that the second parameter can't be null.
    webClient.UploadFileAsync(uploadUri, WebRequestMethods.Ftp.UploadFile, fileName, state);
}

Ответ 2

Мы используем edtFTPnet с хорошими результатами.

Ответ 3

Принятый ответ действительно работает. Но я считаю слишком громоздким регистрировать префикс, реализовывать интерфейс и все такое, особенно, если вам это нужно только для одной передачи.

FtpWebRequest не так сложно использовать. Поэтому я считаю, что для одноразового использования лучше пойти по этому пути:

FtpWebRequest request =
    (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip");
request.Credentials = new NetworkCredential("username", "password");
request.EnableSsl = true;
request.Method = WebRequestMethods.Ftp.UploadFile;  

using (Stream fileStream = File.OpenRead(@"C:\local\path\file.zip"))
using (Stream ftpStream = request.GetRequestStream())
{
    fileStream.CopyTo(ftpStream);
}

Ключ - это свойство EnableSsl.


Для других сценариев смотрите:
Загрузка и загрузка двоичного файла на/с FTP-сервера в С#/. NET