2015-06-18 38 views
1

我看到线程在 How to check FTP connection? 并尝试了一些建议。这是我目前有:检测有效的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服务器?

谢谢!

回答

1

您应该在从FTPWebRequest获得的响应中使用状态码。

你可以看到一个完整列表here

在您的实现

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; 
    }