使用 BITS 时的最佳做法

本部分包含设计使用 BITS 的应用程序时应考虑的信息。

用户上下文或服务上下文

仅当作业的所有者登录到计算机时(用户必须以交互方式登录)时,BITS 才会传输文件。 BITS 不支持 RunAs 命令。 有关详细信息,请参阅用户和网络连接

如果应用程序不需要用户上下文,请考虑编写一个以 LocalSystem、LocalService 或 NetworkService 运行的服务。 这些系统帐户始终处于登录状态,因此传输不受用户注销的影响。 但是,如果在创建作业时模拟用户,则应用交互式登录规则。 有关更多详细信息,请参阅服务帐户和 BITS

作业是持久的

作业将保留在队列中,直到调用 IBackgroundCopyJob::CompleteIBackgroundCopyJob::Cancel 方法。 在调用 Complete 之前,作业中的文件对用户不可用。 通常,当作业的状态为 BG_JOB_STATE_TRANSFERRED 时,调用 Complete;当作业处于 BG_JOB_STATE_TRANSIENT_ERRORBG_JOB_STATE_ERROR 状态且无法继续进行时,调用 Cancel

如果在 90 天内未调用 Complete 方法或 Cancel 方法(默认 JobInactivityTimeout 组策略),则服务会取消该作业。 应始终调用 CompleteCancel 方法,而不是依赖 JobInactivityTimeout 策略来清理作业。 如果达到 MaxJobsPerUser 或 MaxJobsPerMachine 策略限制,队列中留下的作业可能会阻止用户创建其他作业。

何时使用前台或后台优先级

除非作业时间关键或用户正在主动等待,否则应始终使用后台优先级。 但是,有时你可能想要从后台优先级切换到前台优先级,例如,当代理或服务器不支持 Content-Range 标头或客户端上的防病毒软件删除范围标头请求时。 切换到前台优先级仅适用于文件大小小于 2 GB 的文件。 有关示例,请参阅 IBackgroundCopyCallback::JobError 方法的实现。 另请注意,如果前台作业随后因网络断开连接或用户注销而中断,作业将失败,因为 BITS 将发送范围请求,以尝试从中断位置重启传输。

从 Windows 8 开始,当目标服务器不满足 BITS 下载的 HTTP 要求时,应使用 BITS_JOB_PROPERTY_DYNAMIC_CONTENTBG_JOB_PRIORITY_FOREGROUND 配置下载作业。 请记住,如果下载中断(例如,由于连接问题或系统重新启动),则 BITS 必须从头重新启动下载。

有关可用优先级以及 BITS 如何使用优先级计划作业的信息,请参阅 BG_JOB_PRIORITY

暂时性错误和严重错误

某些错误可恢复,有些错误不可恢复。 例如,错误“服务器不可用”是可恢复错误,“访问被拒绝”错误是一个严重错误。 BITS 将可恢复的错误置于暂时性错误状态,并在指定间隔后再次尝试该作业。 如果作业无法取得进展,则 BITS 会将作业移动到严重错误状态。 使用 IBackgroundCopyJob::SetMinimumRetryDelayIBackgroundCopyJob::SetNoProgressTimeout 方法来控制 BITS 如何处理暂时性错误。

对于前台作业,应限制让作业保持暂时性错误状态的时间,并尝试恢复。 使用 SetNoProgressTimeout 方法限制作业处于暂时性错误状态或强制作业进入严重错误状态的时间量。 如果让作业尝试恢复,则应使用 SetMinimumRetryDelay 方法将最小重试延迟设置为 60 秒,或调用 IBackgroundCopyJob::Resume 方法再次激活作业。

有关详细信息,请参阅 BG_JOB_STATEBITS 作业的生命周期处理错误

测量网络带宽使用情况

BITS 可能会使用客户端的网络适配器来估算可用的网络带宽。 由于 BITS 无法测量超出客户端的带宽,因此 BITS 可能会使 WAN 链路拥堵。 若要减少 WAN 链路上的拥塞,可以使用 MaxInternetBandwidth 组策略来限制客户端使用的带宽量。 有关详细信息,请参阅网络带宽组策略

如果你正在编写一个应用程序,许多客户端将使用该应用程序从给定的服务器下载文件,那么你应该考虑一种交错下载请求的方案,这样就不会使服务器过载。

设置代理和服务器身份验证的凭据

如果希望代理或服务器需要用户凭据,则必须向 BITS 提供凭据。 若要指定凭据,请调用 IBackgroundCopyJob2::SetCredentials 方法。 BITS 支持基本、摘要、协商、NTLM 和 Passport 身份验证方案。

有关身份验证的详细信息,请参阅身份验证

指定用户帐户和服务帐户的代理设置

默认情况下,BITS 使用用户的 Internet Explorer 代理设置。 若要替代用户的 Internet Explorer 代理设置,请调用 IBackgroundCopyJob::SetProxySettings 方法。

Internet Explorer 代理设置不适用于系统帐户,因此默认代理行为 (BG_JOB_PROXY_USAGE_PRECONFIG) 仅在 Web 代理自动发现协议 (WPAD) 部署中正常工作,除非执行其他配置步骤。 如果应用程序是作为 LocalSystem、LocalService 或 NetworkService 运行的服务,请考虑在 BITS 作业上配置帮助程序令牌,或者通过使用 BG_JOB_PROXY_USAGE_OVERRIDE 调用 IBackgroundCopyJob::SetProxySettings 来显式设置正确的代理设置。 作为替代方法,可以使用 BitsAdmin.exe 的 /Util /SetIEProxy 开关为 LocalSystem、LocalService 或 NetworkService 系统帐户设置 Internet Explorer 代理设置。 有关详细信息,请参阅 BitsAdmin 工具

BITS 无法识别使用 Proxycfg.exe 文件设置的代理设置。

从 Windows 10 2018 年 10 月更新(10.0;内部版本17763)开始,BITS 使用与 WinHttp 使用 AUTOMATIC_proxy 相同的代理顺序。 当指定 BG_JOB_PROXY_USAGE_PRECONFIG 时,BITS 使用这种更兼容的排序。 BG_JOB_PROXY_USAGE_PRECONFIG 是用于指定 HTTP 代理的默认值。

指定用于对代理进行身份验证的用户特定设置

如果在需要代理身份验证的环境中使用 BITS,同时在计算机的网络域中作为没有可用 NTLM 或 Kerberos 凭据的帐户运行,则必须采取额外步骤,使用在域中具有凭据的另一个用户帐户的凭据进行正确身份验证。 当 BITS 代码作为系统服务(如 LocalService、NetworkService 或 LocalSystem)运行时,这是一种典型的情况,因为这些帐户没有可用的 NTLM 或 Kerberos 凭据。

有关此方案中身份验证的工作原理的详细信息,请参阅身份验证

伸缩性

如果队列中有超过 100 个作业,则性能可能会开始减少,具体取决于作业的组成。 BITS 使用 MaxJobsPerMachine 策略设置对队列中的作业数施加硬性限制。 应用程序应将作业数限制为大约 10 个,以便多个应用程序不太可能超过 100 个作业指南。 通常,具有大量要提交的作业的应用程序首先提交 10 个作业,然后在每个作业完成时一次提交一个作业。

作业中的文件数还应限制为最多 10 个文件。 如果要为作业传输大量文件,请考虑创建包含所有文件的 CAB 文件。

HTTP 标头可以在任何情况下

HTTP 标准一直规定,HTTP 标头必须被视为不区分大小写(RFC 7230 第 3.2 节)。 最新的 HTTP 标准 RFC 7540 更进一步,并表示 HTTP/2 流量必须将标头作为不区分大小写,并且必须以小写形式显示标头(RFC 6540,第 8.1.2 节)。 即使使用非小写标头发送流量,代理也可以选择强制标头小写。

避免个人身份信息 (PII)

具有管理员权限的所有用户可以看到包括作业显示名称和说明和文件名在内的 BITS 作业。 它们也可能添加到 Windows 遥测。 应避免在作业详细信息中放置敏感数据(如用户自己的名称)。