2013-04-11 58 views
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的文件),它可以挂起。这里有什么问题?

**编辑1:**如果我使用PrintWorkDirectory而不是ListDirectory它不会在我检查的目录中引发异常。在画面不是现有目录的服务器上

enter image description here

而且这里的响应对象存在的文件夹的响应对象。它完全一样... enter image description here

回答

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

我不知道为什么它不工作之前,如果有人表示这将是非常感谢:)

现在,此代码工作没有登录问题,也不挂。也许它现在的作品,因为我们读了共鸣我们以前没有做过的事情,并密切响应(没有读过它挂在过去)

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

... 
+0

感谢您的帮助。我测试了这个'WebRequestMethods.Ftp.PrintWorkingDirectory',但它不起作用。结果我每次看到成功(我输入正确和不正确的路径)。至于'GetDateTimestamp' - 它总是会抛出一个异常'所请求的URI对于这个FTP命令无效'与任何我试图检查的文件夹 – Vitalii 2013-04-11 20:59:23

+0

但'UsePassive = false'似乎登录问题真的消失:) 50%完成:) :) :) – Vitalii 2013-04-11 21:17:45

+0

您可以将PrintWorkingDirectory的结果与预期的文件夹进行比较。这将涉及我相信的一些字符串比较。 或者继续使用ListDirectory,但对于很多文件,你会看到一个性能命中:) – rivarolle 2013-04-11 21:36:16

相关问题