2015-10-30 2 views
1

Я пытаюсь написать программу на C# для загрузки файла на FTP, проходящий через прокси.C# - Загрузить файл на FTP через HTTP-прокси

Вот код, который я написал:

public new bool Upload(string localFilePath, string pathUpload) 
{ 
    Stream FStream = null; 
    bool retval = false; 
    FileStream FlStream; 

    try 
    { 
     FtpWebRequest FtpRequest = 
        (FtpWebRequest) FtpWebRequest.Create(Uri + pathUpload); 
     FtpRequest.Credentials = new NetworkCredential(User, Password); 

     if (ProxyAddress != "" && ProxyAddress != null) 
     { 
      WebProxy ftpProxy = new WebProxy(); 
      ftpProxy.Address = new System.Uri(ProxyAddress); 
      ftpProxy.Credentials = 
        new System.Net.NetworkCredential(ProxyUserId, ProxyPassword); 
      FtpRequest.Proxy = ftpProxy; 
     } 

     FtpRequest.Method = System.Net.WebRequestMethods.Ftp.UploadFile; 

     FStream = FtpRequest.GetRequestStream(); 

     FileStream fs = File.OpenRead(localFilePath); 
     byte[] buffer = new byte[fs.Length]; 
     fs.Read(buffer, 0, buffer.Length); 
     fs.Close(); 

     FStream.Write(buffer, 0, buffer.Length); 

     FStream.Close(); 
     FStream.Dispose(); 

     return retval = true; 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine(e.Message); 
     Console.WriteLine(e.ToString()); 
     return false; 
    } 
} 

Если я передаю адрес прокси-сервера он говорит, что команда FTP не поддерживается при использовании HTTP-прокси.

Я уже пробовал форсировать FtpRequest.Proxy = null, как было предложено в другом месте (например, http://www.codeproject.com/Questions/332730/FTP-proxy-problem-in-Csharp-application), но это дает мне исключение «Невозможно подключиться к удаленному серверу».

Я также пробовал использовать класс WebClient вместо FtpWebRequest, но он дает мне те же проблемы.

Заранее за вашу помощь.

ответ

3

FtpWebRequest не поддерживает HTTP-прокси для некоторых операций, включая загрузку файлов. Это явно documented on MSDN:

Если указанный прокси-сервер является HTTP-прокси, только DownloadFile, ListDirectory и ListDirectoryDetails команды поддерживаются.

Комментарий к CodeProject - просто бред. Вы не можете поверить всему, что найдете в Интернете.

WebClient использует FtpWebRequest внутренне, поэтому вы также не можете использовать его.

Невозможно загрузить файл на FTP через прокси-сервер HTTP со стандартными библиотеками .NET Framework.

Вы должны использовать стороннюю библиотеку FTP.


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

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

// Configure proxy 
sessionOptions.AddRawSettings("ProxyMethod", "3"); 
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 см raw settings.

(Я являюсь автором WinSCP)