局域化的在线更新尝试过多次。使用过多种方案。
现在进行总结:
一:局域网环境:
1:数据库。ip,用户名,密码 有时会调整。比如两年一次算好的。
2:共享文件服务器。同上,运维经常更改IP,上线下线服务器。
3:web服务器。同上。
二:其它规则说明:
1:客户端程序,两种:有员工使用的前台程序,无人值守的后台程序。
2:对于ip的变更,配置App.config是比较常见的方式,但是如果布署的后台程序太多,逐一调整是很痛苦的事。尽可能用自动化的方式完成。
3:为了方便上传程序的操作,在线程序的程序清单存储在数据库里。每个程序的下载清单放在下载目录的XML里。
三:上传下载存储的选择:
1:方案一:
共享目录存放需要更新的数据。上传和下载都在这里进行。缺点也很明显
1:容易被攻击。
2:在用户在进行更新时,文件被锁,无法进行上传。
2:方案二:
布署一个WEB上传服务,然后共享文件设为只读,提供下载。缺点是:
1:因为安全问题,有的员工可以访问HTTP,但不可以访问共享文件夹。所以无法正常更新。
3:方案三:
全部通过HTTP进行上传和下载服务。
做到了这一步,其实都可以在公网上更新了。
四:客户端程序进行在线更新操作。
1:首先程序不能覆盖自己,所以写一个独立的在线更新就是必要的了。比如命名为update.exe。
2:为了简化维护起见,更新程序不设配置文件,信息全放在exe里。
3:客户端程序上可以添加“在线更新”命令,执行时就是调用 update.exe {程序名}。然后关闭自己。
4:update.exe等待执行程序退出后,进行下载操作,覆盖客户端程序。
五:客户端的启动检查更新提示
1:其实比较好的方式是先启动update.exe。但这个配置比较烦琐。不考虑。
2:首先,客户端要检查自己是否要更新。然后提示客户是否要更新。然后决定是否调用update.exe后退出。
2.1:方案一:写一个下载类,在里面进行更新的检查和弹出对话框。缺点:
程序有多个,万一URL发生变更,所有程序都要修改,维护量比较大。
2.2:方案二:写一个DLL提供给各程序,封装相关的操作,缺点:
如果DLL更新了,需要重新发布所有程序,或者要去各个服务器和用户机器上替换DLL。
2.3:方案三:折中方案,前台程序支持启动检查,后台程序通过点击update.exe更新。
2.4:方案四:在update.exe里增加检查模式。有更新则提示是否有更新程序。然后返回用户的选择。
客户端以检查模式启动启动update.exe,检查其返回值,如果为1,则再次调用执行更新。
六:无缝切换环境。
1:这里指的是发布服务器的IP发生了变更。怎么让所有的客户端程序知道这一点,并无缝切换。
2:按照上面的设计,工作量全在update.exe上
2.1:首先设置一个切换开关,决定是用前环境 ,还是新环境。这个值可以存在数据库里。方便各方操作。
七:update.exe的自我更新。
1:让客户端程序更新update.exe是不错的选择。缺点是:
所有客户端程序都要增加相关操作。拆中方案就是只让前台程序支持。
2:所以可以考虑让update.exe更新自己,检查到自己要更新了。下载到临时目录里,然后启动它,由后者覆盖自己。
八:布署update.exe
前台程序启动时自动下载update.exe
后台程序则是在布署时复制一个update.exe过来,没想到更好的办法。
九:进一步的考虑:
数据库是为了方便各程序同步。 对update.exe来说,可以只访问http。数据库操作封装到Web上。进一步简化操作。
缺点是:如果web变迁,原来可以把新的web存到数据库。现在就没地方存了。也就是说数据库和Web并存时可以互相支持变迁。
至于说两个Web并存几天,会出现这种情况:服务器换IP而已,所以不能并存。
如果让update.exe缓存新的url,也是一种方案。只是违反了只有一个文件的原则。
不知道以后又会出什么新情况。