将FtpWebRequest与SSL

时间:2016-11-28 15:24:06

标签: c# .net visual-studio ssl ftp

我必须在使用TLS和我的C#应用​​程序(.net 3.5)的FTP上传一些文件 使用Filezila,没问题。

现在,使用我的C#代码,我有一个超时异常,我真的不知道为什么因为Filezila都可以。

这是我的代码:

    public static bool AcceptAllCertificatePolicy(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
    {
        return true;
    }

    public static string Upload_SSL(string filenameSrc)
    {

        ServicePointManager.ServerCertificateValidationCallback = AcceptAllCertificatePolicy;

        FileInfo fileInfSrc = new FileInfo(filenameSrc);
        FtpWebRequest reqFTP;

        // Create FtpWebRequest object from the Uri provided
        if (strDirectory.Trim() != "")
        {
            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + strHost.Trim() + "/" + strDirectory.Trim() + "/" + fileInfSrc.Name.Trim()));
        }
        else
        {
            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + strHost.Trim() + "/" + fileInfSrc.Name.Trim()));
        }

        reqFTP.EnableSsl = true;

        // Provide the WebPermission Credintials
        reqFTP.Credentials = new NetworkCredential(strUser.Trim(), strPass.Trim());

        reqFTP.Proxy = null;

        // By default KeepAlive is true, where the control connection is not closed
        // after a command is executed.
        reqFTP.KeepAlive = false;

        // Specify the command to be executed.
        reqFTP.Method = WebRequestMethods.Ftp.UploadFile;

        // Specify the data transfer type.
        reqFTP.UseBinary = true;

        // Notify the server about the size of the uploaded file
        reqFTP.ContentLength = fileInfSrc.Length;

        // The buffer size is set to 8kb
        int buffLength = 8192;
        byte[] buff = new byte[buffLength];
        int contentLen;

        // Opens a file stream (System.IO.FileStream) to read the file to be uploaded
        FileStream fs = fileInfSrc.OpenRead();

        try
        {
            // Stream to which the file to be upload is written
            Stream strm = reqFTP.GetRequestStream();

            // Read from the file stream 2kb at a time
            contentLen = fs.Read(buff, 0, buffLength);


            // Till Stream content ends
            while (contentLen != 0)
            {
                // Write Content from the file stream to the FTP Upload Stream
                strm.Write(buff, 0, contentLen);
                contentLen = fs.Read(buff, 0, buffLength);
            }

            // Close the file stream and the Request Stream
            strm.Close();
            fs.Close();
        }
        catch (Exception ex)
        {
            fs.Close();
            return (ex.Message);
        }

        return "ok";
    }

现在,来电:

        myFtp.Class1.strHost = "ftp://XXXXXXXXXXXXX";
        myFtp.Class1.strPass = "*****************";
        myFtp.Class1.strUser = "*********";
        myFtp.Class1.nPort = 21;
        myFtp.Class1.Upload_SSL(@"D:\Test.txt");

作为信息,如果我尝试使用我的代码在NON TLS / SLL服务器上上传文件,一切正常。所以问题似乎只适用于TLS / SSL ftp。

有人有想法吗?

非常感谢,

1 个答案:

答案 0 :(得分:0)

我将FTP://保留在主机中,因此网址为FTP://FTP:/xxxxx