.net中FTP GetResponse“基础连接已关闭:服务器提交了协议冲突”的解决办法:
原创:钟德荣([email protected])
在vs2005开发的一个版本下载程序中,将新版本上传到FTP服务器上,通过.net的FTPGetResponse下载新的版本,
和服务器建立连接时即报错:“基础连接已关闭:服务器提交了协议冲突”。
但使用CUTPFT客户端下载是正常的。
FTP服务器上SER_U建立。已经使用了很久了,所以也不可能重新建FTP的服务器。
这个程序在许多的企业的应用中已经使用,说明我的FTP下载的程序是没有任何问题的。
该下载程序在FTP服务器是XINXP、 WIN2000、WIN2003下均使用过,前面没有出现过任何的问题。
代码太多,其中的一个方法取得服务器上文件列表的代码如下:
private string[] GetFileList(string ftpServerIP, string ftpUserID,string strFtpPort, string ftpPassword)
{
string[] downloadFiles;
StringBuilder result = new StringBuilder();
FtpWebRequest reqFTP;
try
{
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP+":"+strFtpPort + "/"));
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
// reqFTP.Method = WebRequestMethods.Ftp.GetFileSize;//获取FTP服务器上的文件大小
WebResponse response = reqFTP.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
string line = reader.ReadLine();
while (line != null && line != "")
{
// if (line.StartsWith(TelCode))//如果是StartsWith以TelCode开头的文件名
//{
//string s=Encoding.UTF8.
result.Append(line.ToLower());
result.Append("/n");
line = reader.ReadLine();
}
result.Remove(result.ToString().LastIndexOf('/n'), 1);
reader.Close();
response.Close();
return result.ToString().Split('/n');
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
downloadFiles = null;
return downloadFiles;
}
}//GetFileList结束
但在部署一个企业的应用时,就在 WebResponse response = reqFTP.GetResponse();出现错误:基础连接已关闭:服务器提交了协议冲突。
在网上查了许多,也没有说出过解决摲办法。
在偿试了多种SER-U的版本和WINDOWS的版本后,其它的都正常,但我要连接的那台服务器就不行。
仍没有找到解决办法。
最后,从网上的一个贴子中得到启示:
“.net中的FTP服务器不支持中消息。”,最后才发现,在FTP服务器中设置了一个中文的消息。
在“域/站点/设置/消息”的界面中,下方有4个消息定义的部分,在该消息定义中,设置了中文消息,
所以,在FTP客户端连接时,即出现“基础连接已关闭:服务器提交了协议冲突”的错误了。
删除消息中的中文消息,下载程序正常运行。反复测试后,确信就是这个中文消息的问题。
看来,.net中的FTP相关的类确实是有BUG的。
在FTP文件上传时,如果出现中文消息,仍会报这个错误。这个没有测试。应该是会的。