C#通过TLS1.2 FTP上传文件时出现「底层连接已关闭:服务器违反协议」错误求助
C#通过TLS1.2 FTP上传文件时出现「底层连接已关闭:服务器违反协议」错误求助
看起来你遇到的这个协议违反错误,在使用FtpWebRequest搭配仅支持TLS 1.2的FTP服务器时确实挺常见的,我结合你的代码和这类问题的常见坑,给你几个具体的解决方向:
强制指定TLS 1.2作为唯一安全协议
你的代码里只开启了Ssl,但没有明确指定TLS版本,ServicePointManager可能会回退到更低的版本(比如TLS 1.0),而服务器只支持1.2就会触发协议冲突。在初始化请求前加上这行代码:ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;注意要确保引用了
System.Net命名空间。关闭KeepAlive长连接
你当前设置了request.KeepAlive = true,但很多TLS FTP服务器对长连接的支持并不好,操作完成后无法正确维持连接会触发协议错误。建议改成:request.KeepAlive = false;启用被动模式(Passive Mode)
FtpWebRequest默认使用主动模式,但大部分现代FTP服务器(尤其是带TLS的)只支持被动模式,主动模式下的端口映射可能被服务器防火墙拦截,导致连接中断。必须加上:request.UsePassive = true;谨慎处理证书验证回调
你现在的回调直接返回true跳过了所有证书验证,测试环境没问题,但生产环境建议根据实际情况做正确的证书链验证,避免安全风险。
调整后的完整代码示例
using System.Net; using System.IO; // 强制指定TLS 1.2 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; // 跳过证书验证(仅测试环境使用) ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true; FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://test.com/products.csv"); request.Credentials = new NetworkCredential("username", "password"); request.EnableSsl = true; request.Method = WebRequestMethods.Ftp.UploadFile; // 关闭长连接 request.KeepAlive = false; // 启用被动模式 request.UsePassive = true; using (Stream fileStream = File.OpenRead(@"C:\Users\Test\Downloads\products.csv")) using (Stream ftpStream = request.GetRequestStream()) { fileStream.CopyTo(ftpStream); }
另外,你可以先用FileZilla这类FTP客户端测试连接:选择TLS 1.2加密方式,用相同的账号密码上传文件,确认服务器端的配置是正常的,这样可以排除服务器本身的问题。
备注:内容来源于stack exchange,提问作者Sami In
相关产品推荐
相关产品推荐

