【问题标题】:Why does FtpWebRequest return an empty stream for this existing directory?为什么 FtpWebRequest 为这个现有目录返回一个空流?
【发布时间】:2018-02-13 14:32:16
【问题描述】:

我不确定为什么会得到这个结果。我在 Linux 服务器上运行它。 (这是我的小网站的共享虚拟主机帐户。)

文件分组如下:

Another Dir 里面有一个文件:

所以我正在尝试使用以下代码检索服务器上不存在的1somelongdir1234567 目录中的badname 目录的内容:

try
{
    FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(
        "ftp://server12.some-domain.com/public_html/1somelongdir1234567/badname");
    ftpRequest.EnableSsl = true;
    ftpRequest.Credentials = new NetworkCredential("user", "password");
    ftpRequest.KeepAlive = true;
    ftpRequest.Timeout = -1;

    ftpRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;

    using (FtpWebResponse response1 = (FtpWebResponse)ftpRequest.GetResponse())
    {
        //*****BEGIN OF EDIT*****
        Console.WriteLine(response1.StatusDescription);
        Console.WriteLine(response1.StatusCode);
        //*****END OF EDIT*****

        using (StreamReader streamReader = new StreamReader(response1.GetResponseStream()))
        {
            List<string> arrList = new List<string>();

            for (; ; )
            {
                string line = streamReader.ReadLine();

                //I get to here, where `line` is null????

                if (string.IsNullOrEmpty(line))
                    break;

                arrList.Add(line);

                //*****BEGIN OF EDIT*****
                Console.WriteLine(line);
                //*****END OF EDIT*****
            }
        }
    }
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

如您所见,badname 没有这样的文件夹,但我的ftpRequest.GetResponse() 没有抛出异常,而是成功,然后streamReader.ReadLine() 返回null,就像我在上面的代码中显示的那样。

更奇怪的是,如果我提供这样的实际目录:

    FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(
        "ftp://server12.some-domain.com/public_html/1somelongdir1234567/Another%20Dir");

streamReader.ReadLine() 仍然返回 null

谁能解释一下原因?


编辑:好的,伙计们,我更新了上面的代码以检索状态代码。不过我还是很疑惑。

首先,这是连接 URI 的三个值和我得到的响应/输出:

示例 1:

//Existing folder
"ftp://server12.some-domain.com/public_html/1somelongdir1234567"

输出:

150 Accepted data connection

OpeningData
drwxr-xr-x    3 username   username         4096 Sep  5 05:51 .
drwxr-x---  118 username   99               4096 Sep  5 05:54 ..
drwxr-xr-x    2 username   username         4096 Sep  5 05:52 Another Dir
-rw-r--r--    1 username   username           11 Sep  5 05:51 test123.txt

示例 2:

//Another existing folder
"ftp://server12.some-domain.com/public_html/1somelongdir1234567/Another%20Dir"

输出:

150 Accepted data connection

OpeningData

示例 3:

//Nonexistent folder
"ftp://server12.some-domain.com/public_html/1somelongdir1234567/SomeBogusName"

输出:

150 Accepted data connection

OpeningData

那么为什么它给我的示例 2 的结果与我得到的 3 相同?

至于它是什么 ftp 服务器,我无法在网络日志和FtpWebRequest 本身中看到它。以下是我从Microsoft Network Monitor 获得的信息:

欢迎使用 Pure-FTPd [privsep] [TLS] ----------..
220-您是允许 50 个用户中的第 4 个用户... 220-当地时间现在是13:14。服务器端口:21...
220-这是一个私人系统 - 没有匿名登录..
此服务器也欢迎 220-IPv6 连接...
220 您将在 15 分钟不活动后断开连接...

【问题讨论】:

    标签: c# .net ftp ftpwebrequest ftpwebresponse


    【解决方案1】:

    ListDirectory/ListDirectoryDetails 方法的 URL 通常应以斜杠结尾。

    没有斜线,结果往往是不确定的。

    WebRequest.Create("ftp://example.com/public_html/1somelongdir1234567/Another%20Dir/");
    

    【讨论】:

    • 哦,伙计。这就是我所需要的吗?最后一刀斩杀!!!天哪,我花了 24 小时才完成它。 :D 谢谢!
    【解决方案2】:

    正如 stuartd 所指出的,您会在响应中获得 FTP 状态代码,据我所知,由于 FTP 命令的工作方式,当服务器无法执行时,您将永远不会出现异常您请求的命令。服务器只会通过 FTP 响应代码告诉您它失败了。

    您必须意识到的一件事是 FTP对于它发回的文本没有标准,因为它从来没有被设计成让它的响应被机器解释。如果您有时间,请查找the code of FileZilla,并检查他们的类以解释文件列表(directorylistingparser.cpp)。有几十种 方法来解释它,应用程序会尝试所有方法,直到其中一种工作正常。因为,除非您知道要连接的 FTP 类型,否则这是唯一的方法。

    因此,如果该特定服务器决定在您请求一个不存在的目录时返回一个空字符串,这就是他们的 FTP 实现的方式,而客户端的问题是弄清楚这意味着什么。

    如果您无法从 FTP 响应代码中找出故障,您可以测试它是否为 现有但为空的文件夹返回了不同的内容。如果是这样,您可以轻松区分该响应和该空响应,并将空响应视为程序中的“未找到”错误。

    【讨论】:

    • 嗯。是的,这一切都让我很困惑。对不起,我对这个 ftp 东西很陌生。我用更多细节更新了我的原始帖子。但我仍然对我收到的内容感到困惑。例如,为什么我在现有目录上得到一个空响应?
    • 我假设,因为文件夹是空的?
    • 没有。空文件夹将返回 "."".."。上面的@MartinPrikryl 指出了它不起作用的原因。我希望它不是那么简单:stackoverflow.com/a/46068279/843732
    猜你喜欢
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    相关资源
    最近更新 更多