【问题标题】:When calling FtpWebRequest.DownloadFile after FtpWebRequest.UploadFile why am I getting an exception?在 FtpWebRequest.Upload 文件之后调用 FtpWebRequest.Download 文件时,为什么会出现异常?
【发布时间】:2021-03-16 15:55:29
【问题描述】:

我有两种方法 (C# 4.8):一种使用 FTP 将文件上传到服务器目录,另一种使用 FTP 从服务器下载文件。这些中的每一个都可以独立工作。但是,当我调用UploadFile(...) 方法后跟Download 方法时,DownloadFile(...) 方法中的FtpWebRequest.Create(...) 方法会抛出异常。

我可以连续拨打DownloadFile(...)没有问题。

我是否遗漏了什么,也许是为了关闭连接?

例外是:

Message:        "The remote server returned an error: 226-File successfully transferred\r\n226 1.707 seconds (measured here), 4.59 Mbytes per second\r\n."

InnerException: null

Status:         ProtocolError

我的代码是:

public void UploadFile(FileInfo SourceFile, string Domain, string TargetFileName, string Username, string Password)
{
    FtpWebRequest _FTPRequest = (FtpWebRequest)WebRequest.Create(Domain + TargetFileName);
    _FTPRequest.Credentials = new NetworkCredential(Username, Password);
    _FTPRequest.Method = WebRequestMethods.Ftp.UploadFile;
    _FTPRequest.UseBinary = true;
    _FTPRequest.KeepAlive = false;
    _FTPRequest.UsePassive = true;

    using (FileStream fileStream = SourceFile.OpenRead())
    using (FtpWebResponse response = (FtpWebResponse)_FTPRequest.GetResponse())
    using (Stream ftpStream = _FTPRequest.GetRequestStream())
    {
        byte[] buffer = new byte[1024];
        int iRead;
        while ((iRead = fileStream.Read(buffer, 0, buffer.Length)) > 0)
            ftpStream.Write(buffer, 0, iRead);
    }
}

public void DownloadFile(ref byte[] TargetArray, string Domain, string SourceFileName, string Username, string Password)
{
    FtpWebRequest _FTPRequest = (FtpWebRequest)WebRequest.Create(Domain + SourceFileName); // exception is thrown here //
    _FTPRequest.Credentials = new NetworkCredential(Username, Password);
    _FTPRequest.Method = WebRequestMethods.Ftp.DownloadFile;
    _FTPRequest.UseBinary = true;
    _FTPRequest.KeepAlive = false;
    _FTPRequest.UsePassive = true;

    using (FtpWebResponse response = (FtpWebResponse)_FTPRequest.GetResponse())
    using (Stream ftpStream = response.GetResponseStream())
    {
        byte[] buffer = new byte[1024];
        int totalRead = 0;
        int iRead;
        while ((iRead = ftpStream.Read(buffer, 0, buffer.Length)) > 0)
        {
            if (buffer.Length > iRead) Array.Resize<byte>(ref buffer, iRead);
            Array.Resize<byte>(ref TargetArray, TargetArray.Length + iRead);
            buffer.CopyTo(TargetArray, totalRead);
            totalRead += iRead;
        }
    }
}

【问题讨论】:

  • 上传后得到什么响应?您可能会遇到错误。所以文件没有正确写入。
  • @jdweng 不,我尝试下载什么文件,或者文件用于将其上传到服务器的方法都没有关系。每当我在上传任何内容后尝试下载任何内容时都会出错。
  • @MartinPrikryl 感谢您提供线索!我花了很长时间才弄清楚如何启用日志记录,但一旦我做到了,我就朝着正确的方向前进。

标签: c# c#-4.0 ftp ftpwebrequest


【解决方案1】:

似乎当我在_FTPRequest.GetRequestStream() 之前调用_FTPRequest.GetResponse() 时,它实际上打开了两个单独的请求并且它们是冲突的。我还不清楚为什么它只会影响后续的下载方法,但是一旦我完全删除了该行,这些方法就会按预期工作。

【讨论】:

    猜你喜欢
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多