SharpBITS.NET - BITS API 的封装
.NET 2.0 的 BITS 封装库。
引言
SharpBITS 是一个封装 BITS SDK 的库,用于在 .NET 平台上与托管代码一起使用。它最初是为一个在缓慢且不稳定的 WAN 链路上传输大文件的项目而设计和实现的。虽然也有其他选项,如使用 FTP,但 BITS 具有一些真实的优势,使其成为首选。
由于它使用 HTTP/HTTPS 协议传输文件,因此不受防火墙限制。此外,它(默认设置下)会保持会话长达 14 天,这在这种情况下提供了可靠的文件传输选项!SharpBITS 的开发项目包含一个小型命令行应用程序和单独的 BITS 封装库。即使已经有一些可用的 BITS 封装自定义实现,甚至也有用于 .NET 托管代码的(请参阅 MSDN 上的"Wrapping Bits"),它们是基于较旧版本的 BITS,并且不支持身份验证等某些功能,因此决定开发一个新的基于 C# 的封装库。
背景
后台智能传输服务 (BITS) 可用于在客户端和服务器之间异步传输(大)文件。后台传输具有优化性,因为 BITS 利用空闲网络带宽传输文件,并可以根据可用空闲网络带宽的多少来增加或减少文件传输速率。如果网络应用程序开始消耗更多带宽,BITS 会降低其传输速率以保留用户的交互体验。如果启动传输的用户保持登录状态并且保持网络连接,BITS 会在应用程序退出后继续传输文件。如果连接丢失或用户注销,BITS 会暂停传输。BITS 在用户注销、跨网络断开连接和计算机重启期间会持久化传输信息。
有关 BITS 的完整描述和文档,请访问MSDN。
要求
使用 BITS 必须满足以下要求
客户端
在客户端,需要 Windows 2000 SP3 或更高版本,并且必须运行 BITS 服务。BITS 也支持 Windows Vista 和 Longhorn Server(具有即将推出的新功能,如 P2P 功能)。
不支持 Windows 95/98/ME/NT。
服务器
对于上传,BITS 在 Windows 2000 Server 上需要 IIS 5.0,在 Windows Server 2003 系列上需要 IIS 6.0;BITS 不支持 Windows XP 上的 IIS 5.1。
使用代码
要开始使用 SharpBITS,您需要创建一个 `BitsManager` 实例。`BitsManager` 是提供访问创建新作业或列出现有作业的单一实例。
创建新作业的代码很简单,如下所示:
BitsManager manager = new BitsManager();
manager.EnumJobs(JobOwner.CurrentUser);
// populate current job list first
BitsJob job = manager.CreateJob("TestJob", JobType.Download);
job.AddFile("https:///bits/mydownload.cab", "C:\\temp\\download.cab");
job.Resume();
同样,迭代所有现有作业并列出其属性也非常简单。每个作业都有各种属性,如名称、所有者、优先级,当然还有要传输的文件列表。(虽然下载作业可以传输多个文件,但上传作业仅限于每个作业一个文件!)
manager.EnumJobs(JobOwner.CurrentUser);
// list either all jobs or for current user only
System.Console.WriteLine("Job Count for current user: {0}",
manager.Jobs.Count.ToString());
foreach (BitsJob job in manager.Jobs.Values)
{
System.Console.WriteLine("Displayname for job: {0}", job.DisplayName);
System.Console.WriteLine("Owner: {0}", job.Owner);
System.Console.WriteLine("Priority: {0}", job.Priority.ToString());
job.EnumFiles();
System.Console.WriteLine("File Count for current job: {0}",
job.Files.Count.ToString());
foreach (BitsFile file in job.Files)
{
System.Console.WriteLine("Local File Name: {0}", file.LocalName);
System.Console.WriteLine("Remote File Name: {0}", file.RemoteName);
System.Console.WriteLine("Bytes total: {0}",
file.Progress.BytesTotal.ToString());
System.Console.WriteLine("Bytes transfered: {0}",
file.Progress.BytesTransferred.ToString());
}
System.Console.WriteLine("Job State: {0}", job.State.ToString());
System.Console.WriteLine("Job Type: {0}", job.JobType.ToString());
}
BITS 允许设置通知接口的回调指针,而不是一直轮询作业的状态。在 SharpBITS 中,这种回调处理被封装为 .NET 事件。有三种不同类型的事件,分别在作业修改、完成或发生错误时触发。当作业的 `JobProgress` 或 `FileProgress` 更新时,也会触发 `JobModifiedEvent` 事件,因此可以用来显示作业进度。
事件处理程序可以附加到特定作业以仅获取该作业的事件,或者附加到 `BitsManager` 以捕获所有事件。即使是后者,您也需要为每个特定作业设置要触发的事件类型。
//Set flags to get notified on Job Completed or Job Error event
job.NotificationFlags =
NotificationFlags.JobTransferred | NotificationFlags.JobErrorOccured;
//never raised with the previous flags
job.OnJobModifiedEvent +=
new EventHandler<JOBNOTIFICATIONEVENTARGS>(job_OnJobModifiedEvent);
致谢
此库中的互操作处理基于“Microsoft Updater Application Block for .NET”的某些实现(http://msdn2.microsoft.com/en-us/library/ms978574.aspx),这是 Enterprise Library 的一部分。
结论
似乎,BITS 可以用于满足各种可靠文件传输的需求,并且目前有些被低估了。我也开始开发一个 Windows Forms 应用程序(上面截图就是从中截取的)。该应用程序的开发仍在进行中,但可以在 SharpBITS.NET 主页上找到运行版本和更多详细信息(包括源代码)。
历史
- 2006/09/07:发布到 CodeProject。
- 2006/10/10:更新发布到 CodeProject。