2009-05-18 2 views
9

Я продолжаю получать исключение, когда пытаюсь выполнить FTP на свой Win 2008 Server из кода C#, используя VS2008 в качестве отладчика.Установить номер порта при использовании FtpWebRequest в C#

Мой тестовый класс выглядит следующим образом:

public class FTP 
{ 
    private string ftpServerIP = "192.168.10.35:21"; 
    private string ftpUserID = "Administrator"; 
    private string ftpPassword = "XXXXXXXX"; 
    private string uploadToFolder = "uploadtest"; 

    public void Upload(string filename) 
    { 
     FileInfo fileInf = new FileInfo(filename); 
     string uri = "ftp://" + ftpServerIP + "/" + uploadToFolder + "/" + fileInf.Name; 
     FtpWebRequest reqFTP; 

     reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); 
     reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); 
     reqFTP.KeepAlive = false; 
     reqFTP.Method = WebRequestMethods.Ftp.UploadFile; 
     reqFTP.UseBinary = true; 
     reqFTP.ContentLength = fileInf.Length; 

     int buffLength = 2048; 
     byte[] buff = new byte[buffLength]; 
     int contentLen; 

     FileStream fs = fileInf.OpenRead(); 
     try 
     { 
      Stream strm = reqFTP.GetRequestStream(); 
      contentLen = fs.Read(buff, 0, buffLength); 

      while (contentLen != 0) 
      { 
       strm.Write(buff, 0, contentLen); 
       contentLen = fs.Read(buff, 0, buffLength); 
      } 

      strm.Close(); 
      fs.Close(); 
     } 
     catch (Exception ex) 
     { 
      throw new Exception(ex.Message); 
     } 
    } 
} 

Когда я выполняю код я получаю Connection Failed с FTP ошибки 227 в вызове GetRequestStream(). В исключения я могу видеть соединение не удается: 192.168.10.35:52184

Я понятия не имею, как он приходит с портом 52184. указываю в ftpServerIP, что он должен быть порт 21.

Я нашел несколько человек с теми же проблемами в google, но я не нашел хороший пример того, как это решение, и я до сих пор не понимаю, почему это происходит.

Кто-нибудь знает, как справиться с этой проблемой?

UPDATE:

Я попытался подключиться к другой FTP-счет и там все работает отлично. Поэтому я тестировал свой FTP-сервер 192.168.10.35:21, но он отлично работает в CuteFTP Pro и подобных. Это только делает его еще более странным.

ответ

7

Мое предположение было бы проблемой брандмауэра Windows, FTP использует другие порты, чем только порт 21 - иногда изменение режима FTP от активного к пассивному помогает получить работу.

reqFTP.UsePassive = false; 

Посмотрите на эту хорошую статью по FTP: Active FTP vs. Passive FTP, a Definitive Explanation

+0

Я думаю, что вижу разницу, но я не могу перейти от пассивного к активному, у кого-нибудь есть хорошее руководство для этого? –

3

Тиз получил это право, он должен был сделать с пассивным режимом

Исправление в коде так безумно просто :)

reqFTP.UsePassive = false; 

И он работал быстро и без ошибок!

1

Важно различать порт COMMAND и порт DATA. Протокол соединения также изменится в зависимости от того, находитесь ли вы в режиме ACTIVE или PASSIVE.

активный режим:

1) клиент инициирует соединение от случайного неустановленного COMMAND порта (N> 1023) к порту COMMAND сервера по умолчанию (21). Клиент укажет свой порт DATA (N + 1) и начнет прослушивать этот порт.

2) Сервер инициирует соединение со своего порта DATA по умолчанию (20) на указанный порт DATA клиента (N + 1).

пассивный режим:

1) клиент инициирует соединение от случайного неустановленного COMMAND порта (N> 1023) к порту COMMAND сервера по умолчанию (21) при пассивной команде. Сервер открывает случайный порт DATA (P> 1023) и отправляет его клиенту.

2) Клиент инициирует соединение со своего порта DATA (N + 1) на указанный порт DATA сервера (P> 1023).

Если вы используете режим ACTIVE, вам, скорее всего, потребуется, чтобы брандмауэр вашего клиента принял соединение с сервером на ваш порт (N + 1> 1024).

В вашем примере вы были в режиме ACTIVE. Ваш клиент инициировал подключение из своего порта COMMAND (52183) к порту COMMAND по умолчанию сервера (21) и указал свой порт DATA (52184 = 52183 + 1). Затем сервер инициировал соединение со своего порта DATA по умолчанию (20) на порт DATA клиента (52184), который, скорее всего, был отклонен брандмауэром клиента.

Надеюсь, это поможет вам решить вашу проблему!

Смежные вопросы