您的位置:首页 > 编程语言 > PHP开发

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

2014-01-25 15:09 936 查看
        最近有一个任务需要我用.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来解决了。




图1




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

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


图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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息