目前我的工作是用C#开发一个桌面软件,装置到散布各地的数以百计的PC上,而且软件的修正和晋级在将来很长一段时间内都很频繁,所以采用了微软的ClickOnce部署技术。这是一种上手很快运用便当的技术,但是你在决议把它应用在一个真正的商业项目中之前,应该理解一些未来可能会搅扰你的问题,然后再判别一下是不是应该采用它。或许本人从头写一个自动晋级框架反而更合适你的状况。
1,无法有效防止非法的下载
运用ClickOnce部署,你的软件的更新版能够发布到Web效劳器上,当用户从开端菜单启动软件时,ClickOnce自动到指定的URL去检测能否存在新版本,并且从这个地址下载最新版本。问题在于,访问这个URL的过程是ClickOnce的内部机能,不和用户产生任何交互,也就没法停止有效的用户考证,要想ClickOnce正常更新,就必需保证这个URL可以恣意访问。招致任何人只需在阅读器输入这个URL,就能够下载程序。
我没有找到好的处理办法,只能尽量增强软件自身的考证机制,即便有人非法下载装置了你的程序,让他无法运用也就而已。
2,.NET Framework装置的懊恼
运用ClickOnce能够自动考证客户端PC能否装置了必需的.NET Framework以及其版本,并且能够自动启动一个下载程序从微软网站获得最新的装置文件。这是一个很有用的功用,普通状况下很难压服用户先去微软网站本人装置.NET Framework,大多数用户以至基本不想晓得什么是Framework(很难和他们解释分明,为什么装置一个很小的软件,需求先装置一个几百兆大的叫做Framework的鬼东西)。但是在实践测试中发现了一个问题,用户的PC在公司内部经过代理才干访问互联网,不知什么缘由,自动下载程序访问微软网站的速度慢到无法承受的水平,大约200M的Framework,60个文件,自动装置整整破费了一个多小时,远远不如本人直接下载装置包手动装置来的快。
幸亏ClickOnce提供了一个选项,你能够把Framework和程序同时发布到本人的效劳器上---但是,由于Visual Studio 2008的一个小Bug,这个选项是不好用的,你需求首先参考【Visual Studio 2008 Service Pack 1 (SP1) Realease Note】这个文档的2.3.1.1章节,手动修复这个小问题---如今你能够把Framework也发布到同一台效劳器上停止下载了,只需你对本人效劳器的速度有自信心。
目前ClickOnce的下载机能不是很智能,不能断点续传:我这边碰到的一个状况就是由于效劳器端的某代理软件的吞吐量不够,下载过程中失败的几率很高;另外假如是散布在多个地域的用户,不一定从哪里下载比拟快,可能有的人反而访问微软官方网站比拟快,但是ClickOnce并没有方法动态切换Framework下载地址。问题的关键是这个Framework自动下载装置的过程,没法灵敏干预,只要在最理想的网络环境中才干真正发挥其优点。
3,.NET Framework装置的另一个懊恼
处理了上面的问题,我曾经把软件和.NET Framework都部署在Web效劳器上,鼠标一点,似乎一切都顺利。但是随着装置软件的用户数越来越多,自动装置过程中发作莫名错误
的投诉电话也越来越多。问题的缘由在于,有些PC里面曾经装置过不同版本Framework3.5SP1,但是又和我发布的版本不尽相同,比方没有言语包等等,ClickOnce没有方法自动掩盖装置。
Framework装置版本抵触的问题其实很常见,普通性的处理方法就是从控制面板删除现有的版本之后重启计算机,再重新装置即可。依然不行的话能够借助微软官方提供的.NET Framework Cleanup工具彻底删除既存版本。但是这种处理方式关于最终用户来说不可承受,他们需求的是真正的ClickOnce:点击一下,帮我处理一切问题。
早知今日懊悔当初,不该给用户一个过高的希冀值,从一开端就教育他们老诚实实的手动装置Framework就好了。
4,装置目录和卸载
软件投入运用后,用户投诉说,每次版本晋级,都会经过很长时间的停顿才干看到程序的启动画面。调查之后发现:ClickOnce部署的程序会装置在C:\Documents and Settings\用户名\Local Settings\Apps\2.0文件夹下的一个随机生成的目录中。版本晋级的时分,并不会直接把老版本删除,而是会随机生成另外一个目录,并且将现有的用户数据文件原封不动的复制过去。假如需求,能够在【控制面板-添加装置程序】中恢复到老的版本继续运用。程序卸载的时分,这个目录会自动被清空。
问题在于,我的这个软件启动后生成保管了数百个XML格式的模板文件和数据文件,大量小文件的磁盘复制操作十分耗时。开发和测试用的PC性能较好停顿还不太明显,不恰巧用户运用的是比拟旧的笔记本电脑,结果版本晋级过程变得十分明显地迟缓。
为理解决这个问题,能够把数据文件寄存在一个独立的文件夹中,可是在卸载的时分,由于这些数据文件不属于ClickOnce的装置目录,也就不能自动删除。假如ClickOnce部署的程序在卸载的时分,可以调用一些自定义的处置就好了。
5,又有新问题了
有一天有个用户搬着他的笔记本电脑来到一个穷乡僻壤,这里没有宽带,只能用一个56K的小猫上网。当他翻开软件想工作的时分,ClickOnce提示他,软件有了更新的版本,你是要装置呢还是暂时跳过?由于对56K小猫的下载速度不太有自信心,他选择了跳过:反正软件的旧版本也能够继续运用,还是先完成工作要紧。过了几天,这个用户回到了宽带社会,心想如今能够晋级版本了,可是当他再次翻开软件,却没有任何关于新版本的提示信息。
虽然我不太了解,ClickOnce就是这样工作的:假如你选择了【跳过】某个版本,那么你就永远【跳过】这个版本了,除非有比之更新的版本发布了,ClickOnce才会再次提示你晋级。假如是我的话,我会给用户提供【暂时跳过】和【不要再提示我这个版本的更新】两个选择,可惜微软的技术人员似乎没有我这样善解人意。
虽然MSDN提供了圆满的编程示例,但是真实世界常常和示例有很大差距,我准备在另一篇文章里面特地讨论一下以API方式停止ClickOnce更新的时分会碰到的各种问题。
6,关于证书的两个问题
第一,发布时分用的测试用证书有个有效期问题,一年之后会招致无法继续更新。所以我发布之前痛快把证书取消掉了,似乎也没有问题,用户装置软件的时分会有个正告。第二,假如ClickOnce从https的地址更新,一定得保证效劳器证书的有效性。假如从阅读器访问这个网址会弹出证书有效性的正告,ClickOnce的更新会失败。前几天碰到一台客户端PC,没有装置Windows的根证书(IT部门的人装系统的时分自作聪明把他以为不用要的组件都给省略了),无法考证效劳器端证书的有效性,招致ClickOnce的更新不能停止。
7,设置选项固然多,但对应实践需求的灵敏性缺乏
ClickOnce的高级设置选项很多。所以当初选择用ClickOnce部署的时分没思索到其实这些选项的灵敏性不大,很难对付实践需求,特别是碰到对操作性 爱钻牛角尖的用户。
用户最后提出来的详细请求实践上是:
1,启动行进行更新;
2,网速过慢,更新过程过于消耗时间的时分,在途中能够随时取消掉,运用老版本启动;
3,用户工作终了,软件关闭的时分,把方才取消掉的更新重新执行一次。由于这时分不焦急工作了,能够渐渐下载
单纯运用ClickOnce的选项设置基本无法完成这样的需求,而全部丢弃ClickOnce也为时已晚,最后只好取消掉选项设置里的自动更新,完整采用编码方式调用API的方式停止更新。过程中固然遇到各种各样的小问题,好在最后根本完成了用户的请求。
不过这也是微软产品的特性:运用便当,看似强大...不灵敏
--------------------------------------------------------------------------------------
本文所描绘的问题,都基于VisualStudio2008 SP1,.NET Framework3.5 SP1的开发环境。
或许在最新版本的VisualStudio2010中,有些问题可能曾经得到改善,我还没有研讨过,另外有些问题可能只是我的误解,欢送大家指正!
--------------------------------------------------------------------------------------