使用WinSCP .Net Assembly访问FTP with TLS Explicit Encryption

        最近有一个任务需要我用.Net实现一个程序来访问FTP。这个FTP使用的加密方式是TLS Explicit Encryption,并且使用Proxy。以前一直使用System.Net.FtpWebRequest连接FTP,但是如果将FtpWebRequest实例化对象的属性EnableSsl=true,并将属性Proxy赋了WebProxy的实例化对象之后。程序运行会throw excption "SSL cannot be enabled when using a proxy"(图1)。查了一下Microsoft的MSDN也没法发现好的solution,没办法只好自己找一个第3方的assembly来解决了。

使用WinSCP .Net Assembly访问FTP with TLS Explicit Encryption_第1张图片 图1


        在网上查了一下很多FTPs的Assembly都是收费的,终于给我找到了一个免费的assembly就是WinSCP,使用非常简单,并且通过了测试。

        首先,去WinSCP Download页面(图2)下载WinScp的软件,当前的版本是5.5.1。

使用WinSCP .Net Assembly访问FTP with TLS Explicit Encryption_第2张图片图2


        安装完成后在程序目录中有2个文件是我们需要的,这2个文件是“WinSCP.exe”和"WinSCPnet.dll","WinSCPnet.dll"是Assembly文件可以在.net中被引用,而"WinSCP.exe"需要和"WinSCPnet.dll"在同一个目录下,因为assembly需要和"WinSCP.exe"进行交互。这些在Visual Studio 2010中设置好了之后,代码实现如下:


            SessionOptions sessionOptions = new SessionOptions();
            sessionOptions.Protocol = Protocol.Ftp;
            sessionOptions.HostName = "xxxxxxxxxxxxxx";
            sessionOptions.UserName = "xxxxxxxxxxxxxx";
            sessionOptions.Password = "xxxxxxxxxxxxxxx";
            sessionOptions.FtpSecure = FtpSecure.ExplicitTls;
            sessionOptions.PortNumber = 21;
            sessionOptions.FtpMode = FtpMode.Passive;

            //如果没有Certificate一定要设置这句话

            sessionOptions.GiveUpSecurityAndAcceptAnyTlsHostCertificate = true;
           

            //使用SessionOptions对象的方法AddRawSettings来添加Proxy         

            sessionOptions.AddRawSettings("ProxyMethod", "3");
            sessionOptions.AddRawSettings("ProxyHost", "proxy-server");
            sessionOptions.AddRawSettings("ProxyPort","8080");

            using (Session session = new Session())
            {
                session.Open(sessionOptions);

                TransferOptions transferOptions = new TransferOptions();
                transferOptions.TransferMode = TransferMode.Binary;

                TransferOperationResult transferResult;

                //上传文件,Session对象的方法PutFiles

                transferResult = session.PutFiles(@"c:\hmz\ZCNC.LOG", "/inbound/aaa.txt", false, transferOptions);

                transferResult.Check();

                foreach (TransferEventArgs transfer in transferResult.Transfers)
                {
                    Console.WriteLine("Upload of {0} succeeded",transfer.FileName);
                }

               //下载文件,Session对象的方法GetFiles
                transferResult=session.GetFiles("/inbound/aaa.txt", @"c:\hmz\aaa.txt", false, transferOptions);

                transferResult.Check();

                foreach (TransferEventArgs transfer in transferResult.Transfers)
                {
                    Console.WriteLine("Download of {0} succeeded", transfer.FileName);
                }
            }

        具体每个Class的使用方法大家去看Library。WinSCP目前支持3种文件传输协议“FTP”,“SFTP”,“SCP”,并且提供了实现的Source Code。


参考:

WinSCP .Net Assembly and COM Library


你可能感兴趣的:(.Net)