连接到端口990时C#FTPS冻结/超时

时间:2017-01-16 13:30:23

标签: c# .net ftp ftpwebrequest ftps

我正在尝试将文件上传到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");
}

有谁知道这段代码有什么问题以及冻结的原因?我有点被困在这里。

1 个答案:

答案 0 :(得分:3)

.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,您需要使用第三方FTP客户端库。在上面链接的问题中提到了一些。 我的 WinSCP .NET assembly也支持隐式FTPS。由于您已使用WinSCP GUI建立连接,因此使用隐式TLS / SSL,您可以拥有code template generated