0

私の Web アプリケーションでは、2 つの FTP フォルダーへのパスを設定する必要があり、モデルの検証では、これらのフォルダーが FTP サーバーに存在するかどうかを確認しようとします。私の問題は、これが通常最初に機能し、2回目も通常機能することです。しかし、3 回目には「リモート サーバーがエラーを返しました: (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

ここに私を助けた解決策があります

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 に答える