最近在開發訂單對帳系統,先從各類支付平臺獲取訂單銷售數據,而後與公司商城訂單數據進行對帳兜底。整體上,各個支付平臺提供數據的方式分爲兩類,通常以接口的方式提供實時數據,好比: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感興趣的話能夠關注我,我會按期的在博客分享個人學習心得。
未經容許不得轉載,轉載請在明顯位置給出出處及連接。