Обнаружение действительного FTP-соединения

Я видел ветку Как проверить FTP-соединение? и попробовал некоторые из предложений. Вот что у меня есть на данный момент:

    private void IsFtpLoginSuccessful(FtpClient ftpClient, string ftpFolder, string ftpUsername, string ftpPassword)
    {
        FtpWebRequest requestDir = (FtpWebRequest)FtpWebRequest.Create(ftpFolder);
        requestDir.Credentials = new NetworkCredential(ftpUsername, ftpPassword);
        try
        {
            Log(LogLevel.Debug, "Just entered TRY block");
            requestDir.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
            WebResponse response = requestDir.GetResponse();
            Log(LogLevel.Debug, "GOOD");
        }
        catch (Exception ex)
        {
            Log(LogLevel.Debug, "BAD");
        }
    }

Если имя пользователя/пароль недействительны, последнее, что регистрируется, это «Только что вошел блок TRY». Код каким-то образом молча выдает ошибки и никогда не регистрирует «ПЛОХО». Если учетные данные действительны, он продолжает выполнение и регистрирует «GOOD».

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

Благодарю вас!


person Eliezer    schedule 18.06.2015    source источник


Ответы (1)


Вы должны использовать коды состояния в ответе, который вы получаете от FTPWebRequest.

Вы можете увидеть полный список здесь

В случае вашей реализации

   private void IsFtpLoginSuccessful(FtpClient ftpClient, string ftpFolder, string ftpUsername, string ftpPassword)
    {
        FtpWebRequest requestDir = (FtpWebRequest)FtpWebRequest.Create(ftpFolder);
        requestDir.Credentials = new NetworkCredential(ftpUsername, ftpPassword);

        Log(LogLevel.Debug, "Just entered TRY block");
        requestDir.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
        FtpWebResponse response = (FtpWebResponse)requestDir.GetResponse();

        if(response.StatusDescription != FtpStatusCode.CommandOK || response.StatusDescription != FtpStatusCode.FileActionOK)
            Log(LogLevel.Debug, "BAD");
    }

Вот пример кода в MSDN.

    public static bool MakeDirectoryOnServer (Uri serverUri)
    {
        // The serverUri should start with the ftp:// scheme. 
        if (serverUri.Scheme != Uri.UriSchemeFtp)
        {
            return false;
        }

        // Get the object used to communicate with the server.
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create (serverUri);
        request.KeepAlive = true;
        request.Method = WebRequestMethods.Ftp.MakeDirectory;

        //Getting the status description
        FtpWebResponse response = (FtpWebResponse)request.GetResponse ();
        Console.WriteLine ("Status: {0}", response.StatusDescription);
        return true;
    }
person Ramie    schedule 18.06.2015