NewLife组件中,经常用到按需下载插件的功能,例如XCode加载各种数据库驱动,又如加载IP库和行政规划地区库等等。这些功能都由WebClientX实现。

Nuget包:NewLife.Core

源码地址:https://github.com/NewLifeX/X/blob/master/NewLife.Core/Web/WebClientX.cs

最佳实践

分析指定Url对应的页面,找到某个名字的链接,然后下载并解压缩。

var client = new WebClientX();
client.DownloadLinkAndExtract("http://x.newlifex.com", "MySql.Data_net80;MySql.Data", "myPlugins")

该示例先抓取页面https://x.newlifex.com的HTML,分析其中的所有超链接。首先查找‘MySql.Data_net80’,其次查找‘MySql.Data’,找到指定关键字开头的超链接后,按照版本时间降序,下载最新的一个,并解压缩到myPlugins目录。

很显然,WebClientX设计的初衷就是自动更新以及驱动下载。我们可以个应用更新包放在任意论坛博客页面上,然后让客户端定期访问(例如每周一次)该页面检查更新。

结构原理

在XCode中加载SQLite驱动示例如下:

PluginHelper.LoadPlugin("System.Data.SQLite.SQLiteFactory", null, "System.Data.SQLite.dll", null)

PluginHelper是对WebClientX的更高层次封装,它是XCode能够动态加载各种数据库驱动的关键技术,其执行逻辑如下:

  1. 在本进程查找类名‘System.Data.SQLite.SQLiteFactory’,如有则返回
  2. 在插件目录查找DLL文件‘System.Data.SQLite.dll’,如有则加载。插件目录配置在核心配置的PluginPath。
  3. 加载WebClientX,准备在插件服务器下载‘System.Data.SQLite’。插件服务器配置在核心配置的PluginServer,该配置同时接收星尘配置中心和星尘代理StarAgent的更新。
  4. PluginServer默认是https://x.newlifex.com,星尘也能提供类似页面并支持级联缓存http://star.newlifex.com/files,专用于企业内网,解决其它应用服务器无法连接公网下载驱动的问题。