You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 15:40:31