问题描述
我有两种方法 (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()
时,它实际上打开了两个单独的请求并且它们是冲突的。我还不清楚为什么它只会影响后续的下载方法,但是一旦我完全删除了该行,这些方法就会按预期工作。