最近在开发订单对帐系统,先从各类支付平台获取订单销售数据,而后与公司商城订单数据进行对帐兜底。整体上,各个支付平台提供数据的方式分为两类,通常以接口的方式提供实时数据,好比:webservice、NVP、restfull api,以文件服务的方式提供周期性数据,好比:SFTP。接口的方式比较简单,随便一个HTTP客户端库都能搞定,而SFTP文件下载服务就不同了,至少须要知足三个条件,否则对接起来就至关麻烦。git
通过调研发现了一个很是好用,且文档全面的SFTP客户端库:github
这个库由componentpro出品,此公司还提供了其它的工具库,功能很是强大,以下:web
从上面能够看出,不只提供FTP client/server、SFTP client/server的库,还提供了Mail、Excel、SAML、PDF的库,真的是太强大了,通过实验也发现它的SFTP封装的真的好用。c#
做者已经使用SFTP Library封装并实现了以上三点需求,代码结构以下:api
这里就不赘述代码设计了,感兴趣请自行查看源码。安全
地址:https://github.com/justmine66/Samples/tree/master/SFTP/SFtpDownloaderrestful
请先安装包:Install-Package SFTP.Downloader -Version 1.0.2,实际使用时,请使用最新版本。async
public class FileNamingStrategy : IFileNamingStrategy { public string GetFileRegexName() { return $"test.csv"; } }
new ServiceCollection() .AddSFtpServices(builder => { // 1. 注册命名服务,用于按需检索文件。 builder.AddNamingStrategy<FileNamingStrategy>(); // 2. 认证方案(任选其一) // 2.1 密码 builder.UsePwdAuthTScheme("sftp-host", "userName", "pwd", "/upload/"); // 2.2 安全密钥 builder.UseSecurityKeyAuthTScheme("sftp-host", "userName", "SFtpDownloader.test.ppk", "/upload/"); });
备注:当使用安全密钥认证方案时,请将私钥设置为嵌入式资源。工具
private readonly ILogger _logger; private readonly IFilesDownloader _downloader; public Engine(ILogger<Engine> logger, IFilesDownloader downloader) { _logger = logger; _downloader = downloader; } public async Task StartAsync(CancellationToken cancellationToken) { var files = await _downloader.DownloadAsync(1); _logger.LogInformation($"The files downloaded: {files.Aggregate((x, y) => $"{x},{y}")}."); }
当须要在运行时才能注入配置时,还能够传入参数options,好比:学习
var files = await _downloader.DownloadAsync(1, options: new SFtpOptions(){ Host = "sftp-host",UserName="userName",Password="pwd",RemoteDirectory="/upload" });
示例github项目地址:https://github.com/justmine66/Samples/tree/master/SFTP/SFtpDownloader.Test
使用起来就是这么简单!!!
本篇首先介绍了实现一个SFTP文件下载器,须要知足的基本需求,而后使用SFTP Library封装了一个既简单又好用的SFTP文件下载器,最后演示了如何使用此库。
若是有什么疑问和看法,欢迎评论区交流。
若是你以为本篇文章对您有帮助的话,感谢您的【推荐】。
若是你对dotnet感兴趣的话能够关注我,我会按期的在博客分享个人学习心得。
未经容许不得转载,转载请在明显位置给出出处及连接。