Microsoft Updater Application Block 应用程序升级器配置文件设计
译者: Tony Qu
该文件包含polling间隔、日志位置、要使用的下载器和验证器的信息,还有在升级过程中所要包含的每一个应用程序的具体信息。对于每一个应用程序,该文件包含客户端设置(如客户端配置文件的位置)和服务器端设置(如特定应用程序升级所需要的manifest文件的位置)。
应用程序升级器配置文件是与控制器应用程序相关联的应用程序配置文件,用于初始化升级进程,该文件常常存储在与控制器可执行文件相同的目录中。
ApplicationUpdater集合包含许多提供设置信息的面向对象的类,这些类是从配置文件中反序列化得到的,被用在内部应用程序升级器组件。
问题描述
管理员需要能够指定应用程序升级器的以下设置:
1. 应用程序升级器多长时间检查一次升级?
2. 在哪里存储日志数据
3. 使用哪种下载器用于拷贝文件
4. 使用哪种验证器验证manifest文件和其他文件
5. 需要升级的应用程序信息,包括客户端配置文件位置和应用程序的manifest文件位置
设计目标、权衡和问题
Updater Application Block开发人员识别出了以下一些与应用程序升级器配置文件相关的设计目标、权衡和问题:
1. 配置文件必须允许管理员指定polling间隔、日志文件位置、下载器和验证器,以及可升级的应用程序列表
2. 为了优化性能,所有的应用程序必须使用相同的下载器和验证器。
3. 在测试环境中,禁止应用程序的验证是明智的。useValidation被包含在该文件的Schema中。
解决方案描述
在应用程序升级器配置文件中有一个<appUpdater>配置节,所有的应用程序升级器设置在该节中配置。
具体实现
下面的例子中演示了一个应用程序升级器配置文件:
<?
xml version="1.0" encoding="utf-8"
?>
<
configuration
>
<
configSections
>
<
section
name
="appUpdater"
type
="Microsoft.ApplicationBlocks.ApplicationUpdater.UpdaterSectionHandler,Microsoft.ApplicationBlocks.ApplicationUpdater"
/>
</
configSections
>
<
appUpdater
>
<
UpdaterConfiguration
>
<
polling
type
="Seconds"
value
="120"
/>
<
logListener
logPath
="C:/AppUpdaterDemo/client/UpdaterLog.txt"
/>
<
downloader
type
="Microsoft.ApplicationBlocks.ApplicationUpdater.Downloaders.BITSDownloader"
assembly
="Microsoft.ApplicationBlocks.ApplicationUpdater,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null"
>
</
downloader
>
<
validator
type
="Microsoft.ApplicationBlocks.ApplicationUpdater.Validators.RSAValidator"
assembly
="Microsoft.ApplicationBlocks.ApplicationUpdater,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null"
>
<
key
>
<
RSAKeyValue
>
<
Modulus
>
tHImy41ZOphETPcWQznlNF6/etc.
</
Modulus
>
<
Exponent
>
AQAB
</
Exponent
>
</
RSAKeyValue
>
</
key
>
</
validator
>
<
application
name
="App1"
useValidation
="true"
>
<
client
>
<
baseDir
>
C:/App1
</
baseDir
>
<
xmlFile
>
C:/App1/AppStart.exe.config
</
xmlFile
>
<
tempDir
>
C:/App1/temp
</
tempDir
>
</
client
>
<
server
>
<
xmlFile
>
http://appserver/appupdates/App1/Manifest.xml
</
xmlFile
>
<
xmlFileDest
>
C:/App1/Manifest.xml
</
xmlFileDest
>
<
maxWaitXmlFile
>
60000
</
maxWaitXmlFile
>
</
server
>
</
application
>
<
application
name
="App2"
useValidation
="true"
>
<
client
>
<
baseDir
>
C:/App2
</
baseDir
>
<
xmlFile
>
C:/App2/AppStart.exe.config
</
xmlFile
>
<
tempDir
>
C:/App2/temp
</
tempDir
>
</
client
>
<
server
>
<
xmlFile
>
http://appserver/appupdates/App2/Manifest.xml
</
xmlFile
>
<
xmlFileDest
>
C:/App2/Manifest.xml
</
xmlFileDest
>
<
maxWaitXmlFile
>
60000
</
maxWaitXmlFile
>
</
server
>
</
application
>
</
UpdaterConfiguration
>
</
appUpdater
>
</
configuration
>
译者: Tony Qu
该文件包含polling间隔、日志位置、要使用的下载器和验证器的信息,还有在升级过程中所要包含的每一个应用程序的具体信息。对于每一个应用程序,该文件包含客户端设置(如客户端配置文件的位置)和服务器端设置(如特定应用程序升级所需要的manifest文件的位置)。
应用程序升级器配置文件是与控制器应用程序相关联的应用程序配置文件,用于初始化升级进程,该文件常常存储在与控制器可执行文件相同的目录中。
ApplicationUpdater集合包含许多提供设置信息的面向对象的类,这些类是从配置文件中反序列化得到的,被用在内部应用程序升级器组件。
问题描述
管理员需要能够指定应用程序升级器的以下设置:
1. 应用程序升级器多长时间检查一次升级?
2. 在哪里存储日志数据
3. 使用哪种下载器用于拷贝文件
4. 使用哪种验证器验证manifest文件和其他文件
5. 需要升级的应用程序信息,包括客户端配置文件位置和应用程序的manifest文件位置
设计目标、权衡和问题
Updater Application Block开发人员识别出了以下一些与应用程序升级器配置文件相关的设计目标、权衡和问题:
1. 配置文件必须允许管理员指定polling间隔、日志文件位置、下载器和验证器,以及可升级的应用程序列表
2. 为了优化性能,所有的应用程序必须使用相同的下载器和验证器。
3. 在测试环境中,禁止应用程序的验证是明智的。useValidation被包含在该文件的Schema中。
解决方案描述
在应用程序升级器配置文件中有一个<appUpdater>配置节,所有的应用程序升级器设置在该节中配置。
具体实现
下面的例子中演示了一个应用程序升级器配置文件:
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)