2010-11-03 4 views
3

Я хочу проверить данные IP и логин, чтобы узнать, активен ли FTP-сервер/детали. Больше ничего.C# - FTP check/test server

Я нашел в Интернете решение, но никто не кажется простым/красноречивым, например, используя класс Ping для проверки и проверки сервера. У меня есть следующие, который не работает:

static private void testConntecion() 
    { 
     FtpWebRequest requestDir = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://172.29.200.158/")); 
     requestDir.Credentials = new NetworkCredential("dvm_user", "dvm"); 

     try 
     { 
      FtpWebResponse response = (FtpWebResponse)requestDir.GetResponse(); 
      Console.WriteLine("Cool Beans"); 
     } 

     catch(Exception ex) 
     { 
      Console.WriteLine(ex); 
     } 
    } 

Я также попытался:

FtpWebRequest requestDir = (FtpWebRequest)FtpWebRequest.Create("ftp://172.29.200.158/"); 

Сообщение об ошибке: System.Net.WebException: запрошенный URI является недопустимой для этой команды FTP. на System.Net.FtpWebRequest.GetResponse()

Заранее спасибо.

+0

Что произойдет, если вы опускаете 'FTP: //'? – Skurmedel

ответ

4

Вы должны установить метод на запросе FTP:

requestDir.Method = WebRequestMethods.Ftp.ListDirectory; 
+0

Привет, эти методы функциональны, но это очень медленно. Если учетные данные неверны, я должен подождать, чтобы поймать исключение «Тайм-аут». Есть ли способ пойти быстрее, чем работает Fillezilla? –

+1

Это может полностью зависящее от сервера, если сервер просто выбирает отказаться от всех неверных запросов вместо того, чтобы давать отрицательный ответ, который вам нужно ждать. Хотя, если сервер действительно дает вам отрицательный ответ, будет исключение (или, возможно, нулевой результат в зависимости от операции). – flindeberg

2

Вам необходимо указать метод, который вы используете для соединения, они могут быть найдены в пространстве имен WebRequestMethods.Ftp. По умолчанию я полагаю, что вы будете пытаться загрузить файл, и ваш URI не укажет загружаемый файл, следовательно, недействительная ошибка URI. Попробуйте поместить тестовый файл в корень вашего FTP-сайта, возможно, вызванный test.txt, а затем изменив ваш URI на ftp://172.29.200.158/test.txt, который затем должен попытаться загрузить файл.

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

+0

просто избил меня до этого –

+0

@ Давид Кемп: С особенностью вашего ответа я думаю, что вы закрываете дыры в моей ... +1;) – Lazarus

1

Почему разве вы просто не рассматриваете исключение в блоке catch ? :: -). В приведенном ниже коде будет правильно определено, работает ли FTP или нет. Он основан на методе веб-запроса «ListDirectoryDetails», который должен быть быстрым и не требует большой пропускной способности (обычно :: - D, т. Е. Если вы не опросите файл FTP 15k).

Переменные: _URL, _User, _Pass, _PassiveMode (вы можете попробовать проверить оба режима).

FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(_URL); 
    FtpWebResponse res; 
    StreamReader reader; 

    ftp.Credentials = new NetworkCredential(_User, _Pass); 
    ftp.KeepAlive = false; 
    ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails; 
    ftp.UsePassive = _PassiveMode; 

    try 
    { 
    using (res = (FtpWebResponse)ftp.GetResponse()) 
    { 
     reader = new StreamReader(res.GetResponseStream()); 
    } 
    } 
    catch 
    { 
    //Handling code here. 
    } 

Я забыл, что это точная ошибка для «мертвого» FTP, но это не так трудно просто поставить точку останова в этом улове, видеть то, что исключение составляет и обработать его :: -).

Просто бросьте все это в функции с 4 параметрами или, возможно, 3, и вы попробуете как пассивный & Активный внутри. Функция вернет логическое значение, работает ли FTP. Когда вы запрашиваете список файлов, есть немного отходов, но это необходимо только в том случае, если вы слишком тщательно разбираетесь. Вы можете удалить «читатель», а также поток ответов, который, я думаю, :: -).

Надеюсь, что это поможет :: -).

0

Я думаю, вам сначала нужно установить requestDir.Method для некоторой команды ftp, прежде чем делать GetResponse(). См. WebRequestMethods.Ftp для возможных команд.