我正在使用以下代码上传文件,它工作得很好,但有时会抛出错误“The underlying connection was closed: The server committed a protocol violation”,并停止进程,当我再次运行它时,它可以顺利上传文件。
有一件事我注意到,如果我运行这个进程来上传多个文件,那么我有时会遇到这个错误。如果我上传的文件少于5个,那么它就可以正常工作。您有什么想法,我应该在哪里查找问题?
我在谷歌上搜索,没有找到一个确定的解决方案,甚至其中一个msdn博客说这是FTPwebrequest中的一个bug,但不确定。
环境:C#4.0,IIS FTP服务器。
提前感谢!
有一件事我注意到,如果我运行这个进程来上传多个文件,那么我有时会遇到这个错误。如果我上传的文件少于5个,那么它就可以正常工作。您有什么想法,我应该在哪里查找问题?
我在谷歌上搜索,没有找到一个确定的解决方案,甚至其中一个msdn博客说这是FTPwebrequest中的一个bug,但不确定。
环境:C#4.0,IIS FTP服务器。
提前感谢!
FileInfo fileInf = new FileInfo(filename);
FtpWebRequest reqFTP;
// Create FtpWebRequest object from the Uri provided
reqFTP = (FtpWebRequest)FtpWebRequest.Create
(new Uri(path + fileInf.Name));
// Provide the WebPermission Credintials
reqFTP.Credentials = new NetworkCredential(user, pwd);
// By default KeepAlive is true, where the control connection
// is not closed after a command is executed.
reqFTP.KeepAlive = false;
// Specify the command to be executed.
reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
// Specify the data transfer type.
reqFTP.UseBinary = true;
reqFTP.Timeout = -1;
reqFTP.UsePassive = true;
// Notify the server about the size of the uploaded file
reqFTP.ContentLength = fileInf.Length;
// The buffer size is set to 2kb
int buffLength = 4096;
byte[] buff = new byte[buffLength];
int contentLen;
// Opens a file stream (System.IO.FileStream) to read the file
// to be uploaded
FileStream fs = fileInf.OpenRead();
try
{
// Stream to which the file to be upload is written
Stream strm = reqFTP.GetRequestStream();
// Read from the file stream 2kb at a time
contentLen = fs.Read(buff, 0, buffLength);
// Till Stream content ends
while (contentLen != 0)
{
// Write Content from the file stream to the FTP Upload
// Stream
strm.Write(buff, 0, contentLen);
contentLen = fs.Read(buff, 0, buffLength);
}
// Close the file stream and the Request Stream
strm.Close();
fs.Close();
}
答案
在我的情况下,将reqFTP.KeepAlive设置为"True"可以消除错误。