【问题标题】:C# FTPS freeze/timeout when connecting to port 990连接到端口 990 时 C# FTPS 冻结/超时
【发布时间】:2017-01-16 13:30:22
【问题描述】:

我正在尝试将文件上传到 FTPS 文件共享。但我无法让代码工作。当下面的代码启动时,程序只是挂起,没有任何错误。最终会出现一个超时错误,表示系统错误。我已经尝试了很多东西,还有图书馆等。有人有 FTPS 上传的经验吗?此代码适用于我尝试过的普通 FTP。

var ftpServerIP = "Ftp.company1.company2.nl:990";
var ftpUserID = "Username";
var ftpPassword = "Password";

FileInfo fileInf = new FileInfo(@"D:\testfile.txt");
string uri = "ftp://" + ftpServerIP + "/" + fileInf.Name;
FtpWebRequest reqFTP;

// Create FtpWebRequest object from the Uri provided
reqFTP =
    (FtpWebRequest)FtpWebRequest.Create(
        new Uri("ftp://" + ftpServerIP + "/IDEE_MOX/" + fileInf.Name));
reqFTP.EnableSsl = true;

// Provide the WebPermission Credintials
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
reqFTP.KeepAlive = false;
reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
reqFTP.UseBinary = true;

reqFTP.ContentLength = fileInf.Length;

int buffLength = 2048;
byte[] buff = new byte[buffLength];
int contentLen;

FileStream fs = fileInf.OpenRead();

try
{
    Stream strm = reqFTP.GetRequestStream();
    contentLen = fs.Read(buff, 0, buffLength);
    while (contentLen != 0)
    {
        strm.Write(buff, 0, contentLen);
        contentLen = fs.Read(buff, 0, buffLength);
    }
    strm.Close();
    fs.Close();
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message, "Upload Error");
}

有谁知道这段代码有什么问题以及为什么会冻结?我有点卡在这里。

【问题讨论】:

  • 冻结在哪一行?
  • @BugFinder 它运行 Stream strm = reqFTP.GetRequestStream();然后它就冻结了
  • 您正在使用端口 990。服务器是否在此端口上侦听 ftp?你想使用 FTP 还是 FTPS?端口 990 用于 ftp TSL/SSL。由于它是一个众所周知的端口号(under1028),它可能会被防火墙或病毒检查程序阻止。端口 990 用于控制,数据在不同的端口号上发送。您应该使用像 wireshark 或 fiddler 这样的嗅探器来帮助开发代码。
  • @jdweng 是的,服务器是端口 990 FTPS (SSL DIRECT)。我可以毫无问题地使用 filezilla 连接到服务器。所以你想说的是我的电脑上有什么东西(防火墙或病毒检查器等)阻止了这个端口?就这样冻死了?
  • 我认为数据位于不同的端口号上,而您只使用一个端口。使用带有 filezilla 的嗅探器并将结果与​​您的应用程序进行比较

标签: c# .net ftp ftpwebrequest ftps


【解决方案1】:

.NET 框架 (FtpWebRequest) 不支持隐式 TLS/SSL。仅显式,见:
Does .NET FtpWebRequest Support both Implicit (FTPS) and explicit (FTPES)?

因此,您无法连接到端口 990(隐式 TLS/SSL)。


尽管您的 FTP 服务器很可能也支持显式 TLS/SSL,但请使用它。您已经设置了EnableSsl(什么是显式 TLS/SSL)。所以只需连接到默认端口 21 即可:

var ftpServerIP = "Ftp.company1.company2.nl"; 

(无需明确指定端口,默认为 21)


在您的服务器不支持显式 TLS/SSL 的极少数情况下,您需要使用第 3 方 FTP 客户端库。上面链接的问题中提到了一些。 我的 WinSCP .NET assembly 也支持隐式 FTPS。由于您已经使用 WinSCP GUI 建立了连接,因此使用隐式 TLS/SSL,您可以拥有一个code template generated

【讨论】:

  • 感谢您的回答,但事情没那么简单。当我从 url 中删除 :990 并转到 ftp 时,我会收到“无法连接到远程服务器”的错误消息。我已阅读您提供的文章,但我不想使用第三方 dll。但看起来使用第三方 dll 是我唯一的选择。
  • 您可以使用独立的 FTP 客户端连接到使用显式 TLS/SSL 的服务器吗?例如 WinSCP。
  • 我尝试使用显式 TLS/SSL 与 WinSCP 连接,但失败了。隐式工作正常
  • 好的,那么您的 FTP 服务器确实不支持显式 FTPS。或者某些东西(防火墙/NAT/等)阻塞了 21 端口。 WinSCP 出了什么问题?
  • 这是错误“无法建立连接,因为目标计算机主动拒绝它。连接失败。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-09
  • 2015-09-17
相关资源
最近更新 更多