2

我在使用一段非常简单的代码时遇到了一些问题:

     private long getFTPLogLength()
    {
        long size;
        FtpWebRequest ftpRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURL));
        ftpRequest.Credentials = new NetworkCredential(ftpUsername, ftpPassword);
        try
        {
            ftpRequest.ReadWriteTimeout = 6000;
            ftpRequest.Method = WebRequestMethods.Ftp.GetFileSize;
            FtpWebResponse respSize = (FtpWebResponse)ftpRequest.GetResponse();
            size = respSize.ContentLength;
            respSize.Close();
        }
        catch (Exception ex)
        {
            logLog.writeEntry(4, "Error getting logsize from FTP: " + ex.Message);
            size = 0;
        }
        return size;
    }

这种方法的重点显然是抓取特定文件的长度。这里的问题是,在某些服务器(即 gameservers.com 服务器)上,此代码不起作用。它适用于我可以测试的所有其他服务器类型。

我在寻求帮助时确实发现了这一点:C# FTP 550 错误,我尝试了一个斜杠和两个,但仍然得到相同的结果。为了更进一步,我只在执行 GetFileSize (SIZE) 时收到 550 错误。如果我执行 GetDateTime (MDTM),它不会抛出此错误。这会让您相信 SIZE 命令已被禁用,或者我无权使用它,但是如果我使用 FileZilla(或任何客户端)连接到服务器,并运行 SIZE games_mp.log 它工作得很好。

这是异常后调试器的屏幕截图(注意,我购买此游戏服务器的目的就是为了修复此错误,因此故意保留凭据以供您进行测试)。

在此处输入图像描述

任何可以帮助我弄清楚我需要做什么才能使其与他们的服务器一起工作的信息都会有所帮助。希望我错过了一些简单的东西。:)

经过更多测试后,如果我让 FileZilla 超时,我手动运行命令,我收到一个错误,关于 SIZE 在 ASCII 模式下不受支持,但如果我开始与服务器建立新连接,它就可以正常工作。

与服务器的新连接: 在此处输入图像描述

超时后的命令: 在此处输入图像描述

希望这对某人意味着什么....

4

3 回答 3

4

(注意:我在这里编写了 FTP 服务器软件,并且可以访问所发生事件的原始服务器日志)

这里的问题很简单,当您在 Filezilla 中尝试 SIZE 命令时,您处于二进制传输模式。当您尝试通过您的客户端(或 Filezilla 重新连接后)运行此命令时,您处于 ASCII 传输模式。

查看实际访问日志,似乎在初始连接上,Filezilla 执行“TYPE I”,然后执行“MLSD”。当它之后重新连接时,它不会再次尝试 MLSD 命令,因此它不会费心执行 'TYPE I'。

在 ASCII 模式下计算实际文件大小是相当耗费资源的(特别是考虑到您的代码本质上会非常频繁地尝试此命令)。它要求我们解析整个文件并替换所有行结束字符。这不是我们一直想要在繁忙的 FTP 服务器上做的事情。

这种行为实际上是由 RFC 解释的:

对 SIZE 命令的 550 错误响应的存在不能被客户端视为不能以当前模式和类型传输文件的指示。服务器可能会因其他原因生成此错误——例如,如果处理开销被认为太大。

在 ASCII 模式下:

ncftp / > quote size games_mp.log
> quote size games_mp.log

Cmd: size games_mp.log
550: SIZE not allowed in ASCII mode.
SIZE not allowed in ASCII mode.

在二进制模式下:

ncftp / > quote size games_mp.log
> quote size games_mp.log

Cmd: size games_mp.log
213: 134901
134901

因此,您在这里的实际解决方法是在尝试获取文件大小之前切换到二进制模式。

我们也非常希望您更改帐户的密码。过去,我们已经看到开放 FTP 帐户的严重滥用行为(有些人认为需要用各种类型的盗版内容填充他们发现的任何 FTP 帐户)。

于 2013-04-25T21:06:37.210 回答
2

Ftp SIZE 命令在基本的 FTP RFC 中不存在,仅在 RFC 3659 中添加。而且,FTP 的错误 550 是“操作不可用”,即服务器告诉它不支持这样的命令。

于 2013-04-24T16:37:12.703 回答
1

如果服务器支持 FEAT 命令,则将其发送到服务器并查看结果列表中是否包含“SIZE”。这应该明确告诉您服务器是否支持 SIZE 命令。这当然假设服务器支持 FEAT 命令本身。

于 2013-04-26T00:58:23.943 回答