【问题标题】:.Net: FtpWebRequest "(503) Bad sequence of commands" error.Net:FtpWebRequest“(503)错误的命令序列”错误
【发布时间】:2008-10-31 04:22:47
【问题描述】:

在大文件 (~200+ MB) 上,我在读取流时收到 503 错误。

ftp = (FtpWebRequest)WebRequest.Create(new Uri(address.AbsoluteUri + @"/" + file.Name));
ftp.Credentials = new NetworkCredential(username, password);
ftp.Method = WebRequestMethods.Ftp.DownloadFile;

response = (FtpWebResponse)ftp.GetResponse();

关于我做错了什么的任何线索或更大文件的更好做法?

【问题讨论】:

    标签: c# .net ftp


    【解决方案1】:

    您是在每次尝试后收到 503 还是仅在后续尝试后收到 503?

    您是否尝试过设置禁用 KeepAlive?

    ftp.KeepAlive = false;
    

    我会尝试一个更强大的 ftp 客户端库,基本免费的可以在 sourceforge

    【讨论】:

    • 从来没有真正找到解决我问题的好方法,但是免费的是一个很好的推荐。
    • 我遇到了同样的异常,然后我将 KeepAlive 设置为 false,结果发现它非常慢,我对此做了一些数学运算。和setting the KeepAlive flag to false will increase file transfer time by 43% on average。当您传输数百个文件时这是不可接受的,因此这不是真正的解决方案,而是一种解决方法,但仍在寻找解决方案
    【解决方案2】:

    我同意最小化 NetworkCredential 对象的数量可以解决问题。我遇到了这个问题并创建了一个 CredentialCache 并添加了每个凭据一次。没有更多的 ftp 错误。

    【讨论】:

    • 在减少 NetworkCredentials 实例的数量后,我运行了一个测试以传输 324 个文件并且没有得到这个异常,所以我也同意这是真正的解决方案 not setting the KeepAlive=false
    • @jaminator 那么您最初是否创建了 324 个 NetworkCredentials 实例并得到了这个异常?你是说KeepAlive=False 不是解决方案,对吧?
    【解决方案3】:

    出于某种原因,一些人似乎注意到只使用一个 NetworkCredential 对象的实例而不是为每个 FtpWebRequest 使用一个新实例取得了一些成功。至少这对我有用。

    【讨论】:

      【解决方案4】:

      错误是由于没有时间让服务器注销。使用 try 语句,当发生此错误时,创建一个短时间延迟并让它重新开始。这将允许服务器从最后一个 rrequest 中注销。

      【讨论】:

        【解决方案5】:

        就我而言,服务器(属于客户端)已更改为仅接受 TLS (SSL) 请求。他们当然没有告诉我们这一点,而且 503 错误消息也没有帮助!

        所以我们需要像这样使用.EnableSsl

                var ftp = WebRequest.Create(uri) as FtpWebRequest;
                if (ftp != null) {
                    ftp.EnableSsl = true; // <- the new bit
                    ftp.Credentials = myCredentials;
                    ftp.KeepAlive = false; // <- you may or may not want this
                }
                return ftp;
        

        为了忽略证书错误,我还需要添加:

        System.Net.ServicePointManager.ServerCertificateValidationCallback +=
                        (sender, certificate, chain, sslPolicyErrors) => true;
        

        据我了解,这行代码具有全局作用,所以只需要在应用程序启动时调用即可。

        :o)

        【讨论】:

          猜你喜欢
          • 2020-01-15
          • 1970-01-01
          • 2016-10-21
          • 2016-06-06
          • 2021-11-11
          • 2020-07-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-07
          相关资源
          最近更新 更多