首页 新闻 会员 周边 捐助

用C#写的FTP服务器程序,可以连上自建的服务器,但连接不上公司的服务器,并显示431错误,怎么解决?

0
[已解决问题] 解决于 2017-10-23 17:01

我用C#写的FTP服务器程序,主要功能是往FTP服务器上传、下载文件、显示文件目录等文件管理方面的用途;我在自己电脑上搭建了一个FTP服务器(设置了SSL)用来测试程序,测试结果是程序预期功能都实现了;后来到公司的FTP服务器(也设置了SSL)上测试,发现连接不上公司的服务器,VS2010上运行后提示的错误为“<431> 431 Unable to negotiate secure command connection”,有没有大神知道问题出在哪里,怎么解决?

 

以下是部分代码:

 1 #region  获取当前目录下明细(包含文件和文件夹)  string[] GetFilesDetailList()
 2             FtpWeb fw = new FtpWeb("10.11.11.21:990", "", "ftpuser", "1234"); //IP地址、端口、用户名、密码等应该是没问题的
 3             string[] FilesDetailList = fw.GetFilesDetailList();
 4             int FilesDetailListLength = FilesDetailList.Length;
 5             Console.WriteLine(FilesDetailListLength);
 6             for (int i = 0; i < FilesDetailListLength; i += 1)
 7             {
 8                 string FilesDetail = FilesDetailList[i];
 9                 Console.WriteLine("{0}", FilesDetail);
10             }
11             #endregion
12 
13 #region  GetFilesDetailList() 获取当前目录下明细(包含文件和文件夹)
14         /// <summary>
15         /// 获取当前目录下明细(包含文件和文件夹)   
16         /// </summary>
17         /// <returns></returns>
18         public string[] GetFilesDetailList()
19         {
20             string[] downloadFiles;
21             try
22             {
23                 StringBuilder result = new StringBuilder();
24                 FtpWebRequest ftp;
25                 ftp = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI));
26                 ftp.UseBinary = true;  // 指定数据传输类型 
27                 ftp.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
28                 ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
29                  
30  
31                 #region  SSL加密
32                 ftp.EnableSsl = true;
33                 //如果要连接的 FTP 服务器要求凭据并支持安全套接字层 (SSL),则应将 EnableSsl 设置为true
34                 //如果不写会报出421错误(服务不可用)
35                 ServicePointManager.ServerCertificateValidationCallback = delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; };
36                 //证书验证过程
37                 #endregion
38                
39  
40                 WebResponse response = ftp.GetResponse();
41                 StreamReader reader = new StreamReader(response.GetResponseStream());
42                 string line = reader.ReadLine();
43                 while (line != null)
44                 {
45                     result.Append(line);
46                     result.Append("\n");
47                     line = reader.ReadLine();
48                 }
49                 result.Remove(result.ToString().LastIndexOf("\n"), 1);
50                 reader.Close();
51                 response.Close();
52                 return result.ToString().Split('\n');
53             }
54             catch (Exception ex)
55             {
56                 downloadFiles = null;
58                 Console.WriteLine("{0}", ex.Message);  
59                 return downloadFiles;
60             }
61         }
62         #endregion

 

 

Bernard.R的主页 Bernard.R | 菜鸟二级 | 园豆:210
提问于:2017-10-18 23:09
< >
分享
最佳答案
0

公司的FTP服务器时用serv-U建的,我后来在自己电脑上用serv-U建了个服务器(设置了SSL),然后用FlashFXP(也设置了SSL)去连接,一开始连不上,后来重装FlashFXP去连接,发现会弹出下图:

选择“接受并保存”,就可以连上服务器了,所以本问题原因应该是是代码里面没有“接受并保存”证书;有没有人知道如何用C#写出“接受并保存”证书?

Bernard.R | 菜鸟二级 |园豆:210 | 2017-10-23 17:00
其他回答(2)
0

sftp 不是用端口号22吗?

~扎克伯格 | 园豆:1923 (小虾三级) | 2017-10-19 13:47

我自己搭建的服务器的端口号确实是22,隐式连接的FTP服务器通常使用990端口

支持(0) 反对(0) Bernard.R | 园豆:210 (菜鸟二级) | 2017-10-19 14:55
0

建议用第三方的FTPClient,比如FluentFTP

https://github.com/robinrodricks/FluentFTP

FtpWebRequest 微软自己都不推荐使用,为了和HttpWebRequest共享基类,强行把有状态的FTP变成无状态的了。

刀是什么样的刀 | 园豆:910 (小虾三级) | 2017-10-20 08:38

谢谢,程序已经写得差不多了,改用第三方FTPClient会增大工作量,还是想想怎么解决上述问题吧

支持(0) 反对(0) Bernard.R | 园豆:210 (菜鸟二级) | 2017-10-20 20:56
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册