0

在我的 Web 应用程序中,我需要设置两个 FTP 文件夹的路径,在模型验证中,我尝试检查这些文件夹是否存在于 FTP 服务器上。我的问题是第一次这通常有效,第二次通常也有效。但是第三次​​出现此错误“远程服务器返回错误:(530)未登录。”

这是我的代码:

try
 {
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(new Uri(model.configData.FTPInputFolder));
    request.Credentials = new NetworkCredential("ftp_free", "ftp_free");
    request.Method = WebRequestMethods.Ftp.ListDirectory;
    request.KeepAlive = false;

    FtpWebResponse response = (FtpWebResponse)request.GetResponse();
    /*response.Close();*/        
 }
 catch (WebException e)
 {
    ModelState.AddModelError("configData.FTPInputFolder", "Directory does not exist " + e.Message);
 }
 // second request for one other directory
 try
 {
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(new Uri(model.configData.FTPOutputFolder));
    request.Credentials = new NetworkCredential("ftp_free", "ftp_free");
    request.Method = WebRequestMethods.Ftp.ListDirectory;
    request.KeepAlive = false;

    FtpWebResponse response = (FtpWebResponse)request.GetResponse();

 }
 catch (WebException e)
 {
    ModelState.AddModelError("configData.FTPOutputFolder", "Directory does not exist" + e.Message);
 } 

一段时间后一切正常,但经过 2-3 次验证(运行此代码)后,“未登录问题”又回来了。我错过了什么?

此外,如果我取消注释response.Close();并且文件存在于文件夹中(里面大约有 25 mb 的文件),它可能会挂起。这里有什么问题?

**Edit1:** 如果我 PrintWorkDirectory改用ListDirectory它,无论我检查什么目录,它都不会引发异常。图中是服务器上不存在目录的响应对象

在此处输入图像描述

这是现有文件夹的响应对象。完全一样。。。 在此处输入图像描述

4

2 回答 2

0

首先,ListDirectory 将列出文件夹中的所有文件,当 FTP 文件夹中有大量文件时,这些文件可能会出现问题。尝试使用:

PrintWorkingDirectory(或者 GetDateTimestamp )。对于“未记录”错误,请尝试将 UsePassive 设置为 false。这为我解决了许多“未记录”错误。

try
{
   FtpWebRequest request = (FtpWebRequest)WebRequest.Create(new Uri(model.configData.FTPInputFolder));
   request.Credentials = new NetworkCredential("ftp_free", "ftp_free");
   request.Method = WebRequestMethods.Ftp.PrintWorkingDirectory;
   request.KeepAlive = false;
   request.UsePassive = false;

   using(FtpWebResponse response = (FtpWebResponse)request.GetResponse())
   {}
}
catch (WebException e)
{
  ModelState.AddModelError("configData.FTPInputFolder", "Directory does not exist " + e.Message);
}

...
于 2013-04-11T20:34:45.943 回答
0

这是一个对我有帮助的解决方案

try
{
   FTPOperations.ListDirectory(model.configData.FTPInputFolder, model.configData.FTPLogin, model.configData.FTPPassword);
}
catch (WebException e)
{
   FtpWebResponse response = (FtpWebResponse)e.Response;
   if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
   {
      ModelState.AddModelError("configData.FTPInputFolder", "Directory does not exists");
   }
   else
   {
      ModelState.AddModelError("configData.FTPInputFolder", "Directory check error: " + e.Message);
   }
}

和方法

public static List<string> ListDirectory(string dirPath, string ftpUser, string ftpPassword)
{
   List<string> res = new List<string>();

   FtpWebRequest request = (FtpWebRequest)WebRequest.Create(dirPath);
   request.Method = WebRequestMethods.Ftp.ListDirectory;
   request.Credentials = new NetworkCredential(ftpUser, ftpPassword);
   request.KeepAlive = false;

   FtpWebResponse response = (FtpWebResponse)request.GetResponse();

   Stream responseStream = response.GetResponseStream();
   StreamReader reader = new StreamReader(responseStream);
   while (!reader.EndOfStream)
   {
      res.Add(reader.ReadLine());
   }
   reader.Close();
   response.Close();

   return res;
} 

我不确定为什么它以前不起作用,如果有人证明这一点,将不胜感激:)

现在这段代码没有登录问题,也不会挂起。也许它现在起作用了,因为我们阅读了我们之前没有做过的事情并关闭了回应(没有阅读过去挂起的内容)

于 2013-04-12T15:49:20.743 回答