在 FtpWebRequest.UploadFile 之后调用 FtpWebRequest.DownloadFile 时为什么会出现异常?

问题描述

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

我可以毫无问题地连续调用 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,buffer.Length)) > 0)
            ftpStream.Write(buffer,iRead);
    }
}

public void DownloadFile(ref byte[] TargetArray,string SourceFileName,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,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;
        }
    }
}

解决方法

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