在这一课中主要讲解了ClickOnce的基础、安全性和编程方式来进行ClickOnce更新
在传统的c/s开发中,我们都会面临部署的难题。如果客户端只是10台以内,问题还不是很大,但是当客户端在10台以上,那么问题就会出现很多,我们需要在每台客户端上搭配环境,安装程序等工作。并且,每台客户端由于不一样,我们安装程序是否会破坏客户端上其他的应用程序呢?是否会碰上dll地狱的问题呢?当我们的应用程序升级之后,我们还要重复的在客户端上进行安装工作,所以每一次应用升级都对实施人员是一个困扰。那么B/S可以帮我们解决很多问题,但是B/S又存在廋客户端的问题,难以实现丰富的客户体验。不能离线数据访问等。
我们可以通过ClickOnce来解决这个问题,我们将windows form应用程序发布到网站、ftp或网络文件共享上,可以有用户自己下载来进行安装,并且在应用程序升级之后,用户可以使应用程序自动升级,而不是由实施人员进行升级。
在ClickOnce中有以下几个更新选项
在应用程序启动中
–发现有新的更新,询问用户是否更新应用程序
•在应用程序启动后
–发现有新的更新,询问用户是否下次运行时更新
•必须更新
–指明使用的最小必须版本
•可编程更新
–将更新过程整合到应用程序中
并且,ClickOnce可以允许下载更新先决条件组建,如这个应用程序是基于.net framework2.0开发的,但是客户机器上没有安装.net framework2.0,在下载安装应用程序时,会提示用户是否安装.net framework2.0。
ClickOnce应用程序缺省状态下运行在沙箱中,沙箱就相当于一个隔离的盒子,他不允许应用程序在没有得到授权的情况下修改本地的资源和非当前服务器资源,保证了应用程序对于客户端的安全。这个机制在javascript中也存在,如在javascript中编写访问客户端文件系统的代码,运行这段代码之前,将会弹出一个提示框,让用户确认。
下面列举了应用程序需要较高的可信权限的情况
- 调用非托管代码
- 访问文件系统或者注册表
- 连接到数据库
- 调用Web Services
我们可以在项目设计的Security面板中来设置应用程序的沙箱边界
ClickOnce还包括部署的安全性
• 建立部署认证
– 配置可信许可证发布
• 信任许可证
– 通过权威机构发布
– 随应用程序部署
• 应用程序开发者任务
– 获得信任许可证(.tlic 文件)
– 设置部署凭证属性
用户认可模型
•始终由用户来建立信任决定
–从CD-ROM安装软件
•对于没有确定目标的计算机很适用
– Internet或者非管理intranet
–用户是管理员
•要求必须的权限
–当应用程序需要比沙箱更高的权限时
•管理员能够通过策略关闭提示
安全更新
• ClickOnce清单被签名
– XMLDSIG(XML 数字签名)
–在部署更新时需要发布者密钥
–确保更新来自于原始发布者
–保证唯一的应用程序识别符
•只有原始发布者能够更新
–防止某种病毒的自动更新
ClickOnce编程
我们可以使用编程的模式来由用户控制是否进行应用程序的更新。
我们可以通过ApplicationDeployment类来控制应用程序的更新
- if (ApplicationDeployment.IsNetworkDeployed)
- {
- //得到当前应用程序的发布信息
- ApplicationDeployment applicationDeployment = ApplicationDeployment.CurrentDeployment;
- label9.Text = "Checking for Update...";
- //检测当前应用程序发布信息中是否存在需要更新的数据
- if(applicationDeployment.CheckForUpdate())
- {
- if (MessageBox.Show("Update Available! Install Now?", "Update Check Result", MessageBoxButtons.YesNo) == DialogResult.Yes)
- {
- //通过调用CheckForDetailedUpdate得到需要更新的详细信息
- UpdateCheckInfo updateCheckInfo = applicationDeployment.CheckForDetailedUpdate();
- label9.Text = "Update to version " + updateCheckInfo.AvailableVersion.ToString() + " of size " + updateCheckInfo.UpdateSizeBytes.ToString();
- //调用当前应用程序发布信息的更新方法来进行应用程序的更新
- applicationDeployment.Update();
- MessageBox.Show("This application will restart.");
- //重新启动应用程序
- Application.Restart();
- }
- }
- }
• 清单中的组文件
– 将相关文件放入同一组中
– 文件以组的方式进行下载
– 在清单中将文件标记为可选
• 在安装期间可选文件不会被下载
– AreFilesLocal 判断是否是本地文件
• 下载文件
– 按照组或者文件名下载
– 可以同时下载(同步或者异步)多个文件