最近有一个任务需要我用.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来解决了。
在网上查了一下很多FTPs的Assembly都是收费的,终于给我找到了一个免费的assembly就是WinSCP,使用非常简单,并且通过了测试。
首先,去WinSCP Download页面(图2)下载WinScp的软件,当前的版本是5.5.1。
安装完成后在程序目录中有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