,技术专题   工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛,技术专题
您的位置:软件 > 开发者网络 > 微软开发专栏 > 技术专题 > 正文
.NET后台智能传输服务实现自动更新(上)
[文章信息]
作者:陶刚编译
时间:2003-08-12
出处:yesky
责任编辑:方舟
[文章导读]
.NET框架组件和Windows有一些有趣的API,它们能够建立通过网络自动更新的应用程序......
advertisement
热点推荐
· 深入探讨SQL Server 2000对XML的支持
· Swing(空)
· 3DS Stodio Max 宝典
· 中小企业服务器配置方案--前 言
· 中小企业服务器配置方案--代理接入服务器(3)
[正文]

上一页  1 2 3 4  下一页

  在自动更新应用程序中使用BITS

  BITS服务在工作期间管理文件下载。一个应用程序建立传送工作,接着给该工作添加一个或者多个文件。一旦工作的文件列表确定了,任务就继续开始(因为开始时工作的状态是挂起的)。工作用于管理一些细节,例如优先级、认证和错误管理。在任何时候工作都能被应用程序终止。

  一旦BITS在一个工作中完成了所有文件的传输,应用程序就调用一个方法结束该工作。Complete方法复制所有文件到它们的最后目的地。尽管BITS文档指导使用"正在复制(copying)"文件结束任务,但是现实中是在目的地将建立临时隐藏文件,Complete方法简单地更改隐藏文件的名称并使它们可见。

  即使最小使用BITS API(只使用IBackgroundCopyManager和IBackgroundCopyJob接口)也能得到自动更新应用程序所需要的每个文件。如果需要使用其它特性,例如枚举或者完成、错误通知,你必须使用另外的接口。

  例程AutoUpdater.exe使用BITS同时完成更新的发现和下载。为了到这个目的,应用程序为更新定义了连续的名称模式:Update1.dll、Update2.dll等等。尽管这不是发现更新的唯一途径,但是它使BITS功能工作得很好。例程维护了一个XML文件用于保存更新状态,该文件的两个相关的部分是接下来的更新数量和描述当前BITS下载工作的GUID(如果目前没有工作的话)。

  应用程序每次运行,它打开XML文件并检查它看接下来的更新是否已经下载。如果没有的话,XML文件中就没有工作的GUID,应用程序初始化BITS工作来在线下载接下来的更新。下面的代码演示了初始化下载工作的必要方法:

IBackgroundCopyJob job=null;

// 建立工作下载接下来的更新
bcm.CreateJob("Application Update",
BG_JOB_TYPE.BG_JOB_TYPE_DOWNLOAD, out jobID, out job);

// 将工作添加到文件
job.AddFile(updateUrl, localLocation);
job.Resume(); // 启动工作

  调用job.AddFile传递要下载文件的位置、完成的本地路径和最后保存的文件名。注意任务在开始为挂起状态,在BITS服务处理工作前必须重新开始。

  如果XML文件中有GUID,BITS任务就已经被初始化了。因此该GUID被传递到IBackgroundCopyManager.GetJob方法查看先前安排的下载任务是否有结果了。下一步依赖工作的状态。
在下面的代码(图2)中如果工作处于错误状态,应用程序就结束该工作(它从队列中清除失败工作)并接着为相同的下载文件建立一个新工作。错误状态的最可能的原因很简单,即有名称不存在的更新。这实现了例程中的发现更新部分。

  使用BITS查询更新的好处是BITS在后台工作。因此尽管查询并不是特别的优雅,非强制性的BITS下载是发现更新的可行方法。

  如果处于已传输状态,应用程序接着调用IBackgroundCopyJob.Complete来结束任务。这导致文件写入目标目录,使它准备好更新。接着应用程序返回,这时下载的文件片会融合在一起。

bcm.GetJob(ref jobID, out job); //获取BITS工作对象
job.GetState(out state); // 检查状态

switch(state){
case BG_JOB_STATE.BG_JOB_STATE_ERROR: //如果出现错误
job.Complete();
xml.BitsJob = Guid.Empty;
Marshal.ReleaseComObject(job);
job = null;
break; //继续建立新工作
case BG_JOB_STATE.BG_JOB_STATE_TRANSFERRED: //如果获得了文件
job.Complete(); //结束工作
xml.BitsJob = Guid.Empty;
return; //所有完成,返回
default:
return;
}
... // 为更新下载初始化一个新工作

图2.检查工作状态和结束工作

  最后,在默认情况下图2种的例程简单地返回并忽略工作。工作可能有两种状态:正在传输状态(这意味者工作在进行中)或者瞬间错误状态。这两种状态都被认为是可以潜在成功的,因此应用程序单独留下足够空间。如果BITS任务进入瞬时错误状态,BITS服务认为该错误可以恢复,因此它再次尝试。最后,瞬时错误的任务要么成功要么BITS将它置为错误状态。

  错误恢复逻辑覆盖了整个发现和下载AutoUpdater.exe应用程序组件。鉴于下载过程的更深的功能,该实现方法看起来不像网络通讯并且与通常的文件复制相似。在产品应用程序中你会发现将使用BITS API的大量其它特性的使用,例如自动传输通知、任务优先级维护和上载任务。


上一页  1 2 3 4  下一页

发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
,技术专题相关内容,技术专题焦点新闻
  • FVD刺激高清碟机加速商业化 抢占商机最重要
  • 3家搜索引擎集体诉讼8848 吕春维未敢出席
  • 杨元庆:没有准备不会获批的备用方案
  • 军队信息化诞生新领域 电子军务呼之欲出
  • 世界经济论坛公布信息化程度全球最新排名
  • 2004政务绩效评估:政府门户尚处于发展阶段
  • 甲骨文出资5.15亿美元 意图收购RetekInc
  • 技术并购:帮你突破传统增长的“天花板”
  • ,技术专题Advertisement