使用 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 原則限制,佇列中留下的作業可能會防止使用者建立其他作業。

使用前景或背景優先順序的時機

除非作業是時間關鍵,或使用者正在主動等候,否則您應該一律使用背景優先順序。 不過,有時候您可能會想要從背景優先順序切換至前景優先順序,例如 Proxy 或伺服器不支援 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 組策略來限制用戶端使用的頻寬量。 如需詳細資訊,請參閱 網路頻寬組策略

如果您要撰寫許多用戶端會用來從指定伺服器下載檔案的應用程式,您應該考慮一種配置,以阻止下載要求,讓您不要以要求多載伺服器。

設定 Proxy 和伺服器驗證的認證

如果您預期 Proxy 或伺服器需要使用者認證,則必須將認證提供給 BITS。 若要指定認證,請呼叫 IBackgroundCopyJob2::SetCredentials 方法。 BITS 支援基本、摘要、交涉、NTLM 和 Passport 驗證配置。

如需驗證的詳細資訊,請參閱 驗證

指定用戶帳戶和服務帳戶的 Proxy 設定

根據預設,BITS 會使用使用者的 Internet Explorer Proxy 設定。 若要覆寫使用者的 Internet Explorer Proxy 設定,請呼叫 IBackgroundCopyJob::SetProxy 設定 方法。

Internet Explorer Proxy 設定不適用於系統帳戶,因此除非採取其他設定步驟,否則預設 Proxy 行為 (BG_JOB_PROXY_USAGE_PRECONFIG) 只會在 Web Proxy 自動探索通訊協定 (WPAD) 部署中正常運作。 如果您的應用程式是以 LocalSystem、LocalService 或 NetworkService 執行的服務,請考慮在 BITS 作業上設定協助程式令牌,或呼叫 IBackgroundCopyJob::SetProxy 來明確設定正確的 Proxy 設定 設定 搭配BG_JOB_PROXY_USAGE_OVERRIDE。 或者,您可以使用 Bits 的 /Util /SetIEProxy 參數 管理員.exe 設定 LocalSystem、LocalService 或 NetworkService 系統帳戶的 Internet Explorer Proxy 設定。 如需詳細資訊,請參閱 Bits 管理員 Tool

BITS 無法辨識使用 Proxycfg.exe 檔案所設定的 Proxy 設定。

從 Windows 10 2018 年 10 月更新 開始 (10.0;組建 17763),BITS 會使用 WinHttp 搭配AUTOMATIC_PROXY所使用的相同 Proxy 順序。 當指定BG_JOB_PROXY_USAGE_PRECONFIG時,BITS 會使用此更相容的順序。 BG_JOB_PROXY_USAGE_PRECONFIG是指定 HTTP Proxy 的預設值。

指定驗證 Proxy 的使用者特定設定

如果您在環境中使用 BITS,而該環境中在執行時需要 Proxy 驗證,但計算機網路網域中沒有可用 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 節)。 即使流量是以非小寫標頭傳送,Proxy 也可能會選擇強制標頭以小寫。

避免個人識別資訊 (PII)

具有系統管理員許可權的所有使用者可以看到包括作業顯示名稱和描述和檔名的 BITS 作業。 它們也可以新增至 Windows 遙測。 您應該避免在作業詳細數據中放置敏感數據(例如使用者自己的名稱)。