前言

最近在开发订单对账系统,先从各种支付平台获取订单销售数据,然后与公司商城订单数据进行对账兜底。总体上,各个支付平台提供数据的方式分为两类,一般以接口的方式提供实时数据,比如:webservice、NVP、restfull api,以文件服务的方式提供周期性数据,比如:SFTP。接口的方式比较简单,随便一个HTTP客户端库都能搞定,而SFTP文件下载服务就不一样了,至少需要满足三个条件,不然对接起来就相当麻烦。

  1. 支持密码认证
  2. 支持安全密钥认证
  3. 支持根据按文件命名策略检索文件,即支持正则检索文件。

经过调研发现了一个非常好用,且文档全面的SFTP客户端库:

  1. GitHub
  2. 官方文档

这个库由componentpro出品,此公司还提供了其它的工具库,功能非常强大,如下:

从上面可以看出,不仅提供FTP client/server、SFTP client/server的库,还提供了Mail、Excel、SAML、PDF的库,真的是太强大了,经过实验也发现它的SFTP封装的真的好用。

如何封装

作者已经使用SFTP Library封装并实现了以上三点需求,代码结构如下:

这里就不赘述代码设计了,感兴趣请自行查看源码。

地址:https://github.com/justmine66/Samples/tree/master/SFTP/SFtpDownloader

如何使用

请先安装包:Install-Package SFTP.Downloader -Version 1.0.2,实际使用时,请使用最新版本。

1. 实现文件命名策略接口

public class FileNamingStrategy : IFileNamingStrategy
{
public string GetFileRegexName()
{
return $"test.csv";
}
}

2. 配置文件下载器

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/");
});

备注:当使用安全密钥认证方案时,请将私钥设置为嵌入式资源。

3. 使用文件下载器

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感兴趣的话可以关注我,我会定期的在博客分享我的学习心得。

未经允许不得转载,转载请在明显位置给出出处及链接。

[dotnet] 封装一个同时支持密码/安全密钥认证的SFTP下载器,简单易用。的更多相关文章

  1. 转:【专题十一】实现一个基于FTP协议的程序——文件上传下载器

    引言: 在这个专题将为大家揭开下FTP这个协议的面纱,其实学习知识和生活中的例子都是很相通的,就拿这个专题来说,要了解FTP协议然后根据FTP协议实现一个文件下载器,就和和追MM是差不多的过程的,相信 ...

  2. 专题十一:实现一个基于FTP协议的程序——文件上传下载器

    引言: 在这个专题将为大家揭开下FTP这个协议的面纱,其实学习知识和生活中的例子都是很相通的,就拿这个专题来说,要了解FTP协议然后根据FTP协议实现一个文件下载器,就和和追MM是差不多的过程的,相信 ...

  3. 实现一个基于FTP协议的程序——文件上传下载器(十三)

    此为一个系列,后续会把内容补上...

  4. 基于iOS 10、realm封装的下载器

    代码地址如下:http://www.demodashi.com/demo/11653.html 概要 在决定自己封装一个下载器前,我本以为没有那么复杂,可在实际开发过程中困难重重,再加上iOS10和X ...

  5. Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!

    Go/Python/Erlang编程语言对比分析及示例   本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性, ...

  6. Node教程——封装一个token验证器

    重要说明 这个轮子是 使用 express@5.0 + MongoDB构建起来的一个 node后台通用的验证器,里面主要讲的就是使用jwt,token进行验证,当然你想使用session也没问题,但是 ...

  7. 自己封装一个Log模块

    Unity自己有log系统,为什么要自己封装一个 1.不好用,只能在pc上记录log文件,移动平台是没有的 2.在开发时期的log,不想在正式版里面出现.没有一个统一的开关来控制是不是要显示log,要 ...

  8. 使用libzplay库封装一个音频类

    装载请说明原地址,谢谢~~      前两天我已经封装好一个duilib中使用的webkit内核的浏览器控件和一个基于vlc的用于播放视频的视频控件,这两个控件可以分别用在放酷狗播放器的乐库功能和MV ...

  9. 网络游戏开发-服务器(01)Asp.Net Core中的websocket,并封装一个简单的中间件

    先拉开MSDN的文档,大致读一遍 (https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/websockets) WebSocket 是一 ...

随机推荐

  1. Ubuntu设置代理的方法

    用过Linux的都知道,众多的PROXY配置,让人应接不暇,本文列出常见的一些PROXY的配置 1.apt-get proxy 的配置sudo gedit /etc/apt/apt.conf NOTE ...

  2. 保证你能看懂的KMP字符串匹配算法

    文章转载自一位大牛: 阮一峰原网址http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm ...

  3. SOFA 源码分析 — 链路数据透传

    前言 SOFA-RPC 支持数据链路透传功能,官方解释: 链路数据透传功能支持应用向调用上下文中存放数据,达到整个链路上的应用都可以操作该数据. 使用方式如下,可分别向链路的 request 和 re ...

  4. Java c# 跨语言Json反序列化首字母大小写问题

    C#标准是首字母大写,Java规范是首字母小写,在序列化成Json之后,反序列化会出现反序列化失败的问题.. 从C#反序列化成JavaBean的时候通过如下注解可以直接解决该问题 @JsonNamin ...

  5. netcore入门-基础

    .NETCORE1.0出来了,咦不错,什么开源,跨平台的,观望下等2.0:我擦2.0出来了可以学习了,截止到目前2.1都快出来了,是时候学习一下了. 先建一个webapi项目,从简单的demo开始 l ...

  6. 关于Spring的HibernateTemplate的findByExample方法使用时的一点注意。

    此前我们已经介绍了HibernateTemplate的使用配置方法,但是对其使用没有仔细说明.因为最近比较忙,我先不去介绍,而是重点说明一下容易引起问题的findByExample方法. 我尝试反编译 ...

  7. css多类选择器

    <!DOCTYPE html> <html lang="zh-CN"> <head> <style type="text/css ...

  8. python笔试题(1)

            为了充实自己,小编决定上传自己见到的笔试题和面试题.可能要写好长时间,一时半会写不了多少,只能说遇到多少写多少吧,但是只要小编有时间,会持续上传(但是答案却不能保证,所以有看到错误的及 ...

  9. 基于SpringBoot + Mybatis实现SpringMVC Web项目

    一.热身 一个现实的场景是:当我们开发一个Web工程时,架构师和开发工程师可能更关心项目技术结构上的设计.而几乎所有结构良好的软件(项目)都使用了分层设计.分层设计是将项目按技术职能分为几个内聚的部分 ...

  10. SSM-Spring-21:Spring中事物的使用案例

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 股票买卖案例(我会用三种开启事物的方法 代理工厂bean版的,注解版的,aspectj xml版的) 简单的介 ...