C# FTP 显式 SSL 请求从不登录

C# FTP Explicit SSL Request Never Logs In

我正在尝试使用 C# 与 FileZilla 服务器建立 FTPS 连接,但 C# 应用程序从未登录到服务器,服务器关闭了连接,我在 C# 中收到以下错误:

The underlying connection was closed: The server committed a protocol violation.

我的C#代码是这样的:

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
var req = (FtpWebRequest)WebRequest.Create("ftp://<my IP>:<my port>/");
req.UsePassive = true;
req.UseBinary = true;
req.EnableSsl = true;
req.KeepAlive = true;
req.Credentials = new NetworkCredential("Puff", "Daddy");
req.Method = WebRequestMethods.Ftp.ListDirectory;
using (var response = (FtpWebResponse)req.GetResponse())
{
    //Do Something
}

在尝试连接时,FileZilla 服务器界面打印以下内容:

C# 网络日志如下所示:

System.Net.Sockets Verbose: 0 : [6424] Socket#54135081::Socket(AddressFamily#23)
System.Net.Sockets Verbose: 0 : [6424] Exiting Socket#54135081::Socket() 
System.Net.Sockets Verbose: 0 : [6424] DNS::TryInternalResolve(<FTP Server IP>)
System.Net.Sockets Verbose: 0 : [6424] Socket#5773521::Connect(<FTP Server IP>:<FTP Port>#-1925092664)
System.Net.Sockets Information: 0 : [6424] Socket#5773521 - Created connection from <local IP>:61169 to <Server IP>:<Server Port>.
System.Net.Sockets Verbose: 0 : [6424] Exiting Socket#5773521::Connect() 
System.Net.Sockets Verbose: 0 : [6424] Socket#54135081::Close()
System.Net.Sockets Verbose: 0 : [6424] Socket#54135081::Dispose()
System.Net.Sockets Verbose: 0 : [6424] Exiting Socket#54135081::Close() 
System.Net Information: 0 : [6424] FtpControlStream#63094882 - Created connection from <Local IP>:61169 to <Server IP>:<Server Port>.
System.Net Information: 0 : [6424] Associating FtpWebRequest#59817589 with FtpControlStream#63094882
System.Net.Sockets Verbose: 0 : [6424] Socket#5773521::Receive()
System.Net.Sockets Verbose: 0 : [6424] Data from Socket#5773521::Receive
System.Net.Sockets Verbose: 0 : [6424] 00000000 :                                                 : 
System.Net.Sockets Verbose: 0 : [6424] Exiting Socket#5773521::Receive()    -> Int32#0
System.Net.Sockets Verbose: 0 : [6424] Socket#5773521::Dispose()
System.Net Information: 0 : [6424] FtpWebRequest#59817589::(Releasing FTP connection#63094882.)
System.Net Error: 0 : [6424] Exception in FtpWebRequest#59817589::GetResponse - The underlying connection was closed: The server committed a protocol violation.

我已经从装有 FileZilla 客户端的同一台 PC 以相同参数成功建立连接,所以我知道它应该可以工作。

我已将这些行添加到 App.Config。

<system.net>
  <settings>
    <servicePointManager expect100Continue="false"/>
    <httpWebRequest useUnsafeHeaderParsing="true"/>
  </settings>
</system.net>

我也尝试过针对 .NET Framework 3.5 和 2.0,但两者的结果相同。目前我是 运行 .NET 4.6。我是否必须安装服务器证书或其他东西?还是代码有误?

在我发布这个问题后大约 2 分钟,我得到了答案。我会留下它,以防其他人遇到这些困难(我有时喜欢接受有人分享我的问题的想法,但不太可能)。

在 FileZilla 服务器的 "FTP over TLS settings" 对话框中,我配置了一个端口来侦听隐式 FTP 或 TLS(默认为 990)。这是我在 FZ Client FTPS 连接中使用的端口。我还尝试从 C# 使用此端口,但它不起作用,因为连接是显式的 FTPS。我必须使用常规设置中指定的端口作为监听端口(默认 21)。

其实我在发帖之前试过这个,但是忘记应用路由器的配置所以没用,"Der"。