大致的心路历程和方案确定过程是这样:这个项目的服务端是基于windows服务,引用SignalR(WebSocket)与客户端进行交互。众所周知SignalR的使用场景是即时通讯、通知等数据量不大的交互,在这个项目中主要用于下发一些参数和接收调用命令,数据量交互很小的场景。如果要用windows服务作为载体来传输大文件(比如升级包)是无法实现了,我查阅了下资料ASP.NET Core SignalR支持流式传输。但是这个项目用的是.net framework,所以用SignalR来实现传输文件的方案是不行的,还是得走传统的http方式来传输,不浪费服务器资源在部署一个站点来专门处理文件传输,就想到了用OWIN托管API来实现(不了解的同学自行百度)。以下是具体实现过程及代码:
首先在服务的OnStart方法中增加启动一个服务,url可以通过配置或者写死如http://x.x.x.x:6088,后续客户端发起http请求的地址
然后在启动类Startup中加入路由配置,客户端按此路由规则请求具体的控制器的方法。
接下来就新建控制器方法来具体写文件传输Response给客户端。
下面是客户端下载服务端的http调用接口代码
以上就完成了基于Windows服务端的传输文件,下载完成的文件如果是压缩包还需解压出来,这里就不赘述了。希望以上对读者有所帮助。