使用 BITS 時的最佳做法
本節包含設計使用 BITS 的應用程式時應考慮的資訊。
用戶內容或服務內容
只有在作業的擁有者登入計算機時,BITS 才會傳輸檔案(用戶必須以互動方式登入)。 BITS 不支援 RunAs 命令。 如需詳細資訊,請參閱 用戶和網路連線。
如果您的應用程式不需要用戶環境,請考慮撰寫一個以 LocalSystem、LocalService 或 NetworkService 身分執行的服務。 這些系統帳戶一律會登入,因此傳輸不會受限於用戶註銷。 不過,如果您在建立作業時假冒使用者身份,則會套用相關的互動登入規則。 如需詳細資訊,請參閱 服務帳戶和 BITS。
作業是持續性的
作業會保留在佇列中,直到您呼叫 IBackgroundCopyJob::Complete 或 IBackgroundCopyJob::Cancel 方法為止。 除非您呼叫 Complete,否則作業中的檔案無法供使用者使用。 一般而言,當作業的狀態為 BG_JOB_STATE_TRANSFERRED時,您會呼叫 Complete,而且當作業處於 BG_JOB_STATE_TRANSIENT_ERROR 或 BG_JOB_STATE_ERROR 狀態且無法再進行進度時,呼叫 Cancel。
如果您未在 90 天內呼叫 Complete 方法或 Cancel 方法(預設 JobInactivityTimeout 組策略),服務就會取消作業。 您應該一律呼叫 Complete 或 Cancel 方法,不要依賴 JobInactivityTimeout 的政策來清理您的作業。 如果達到 MaxJobsPerUser 或 MaxJobsPerMachine 原則限制,佇列中留下的作業可能會防止使用者建立其他作業。
使用前景或背景優先順序的時機
除非作業是時間關鍵,或使用者正在主動等候,否則您應該一律使用背景優先順序。 不過,有時候您可能會想要從背景優先順序切換至前景優先順序,例如 Proxy 或伺服器不支援 Content-Range 標頭,或用戶端上的防病毒軟體會移除範圍標頭要求。 切換至前景優先順序僅適用於檔案大小小於 2 GB 的檔案。 如需範例,請參閱 IBackgroundCopyCallback::JobError 方法的實作。 另請注意,如果前景作業因為網路中斷或使用者註銷而中斷,作業將會失敗,因為BITS會傳送範圍要求,以嘗試從中斷的位置重新啟動傳輸。
從 Windows 8 開始,當目標伺服器不符合 BITS 下載的 HTTP 需求時,您應該使用 BITS_JOB_PROPERTY_DYNAMIC_CONTENT 和 BG_JOB_PRIORITY_FOREGROUND 來設定下載作業。 請記住,如果下載中斷,這會導致 BITS 必須從頭重新啟動下載(例如,因為連線問題或系統重新啟動)。
如需可用優先順序的相關資訊,以及 BITS 如何使用優先順序層級排程作業,請參閱 BG_JOB_PRIORITY。
暫時性與嚴重錯誤
某些錯誤是可復原的,有些則無法復原。 例如,「伺服器無法使用」錯誤是可復原的錯誤,而「拒絕存取」錯誤是嚴重錯誤。 BITS 會將可復原的錯誤置於暫時性錯誤狀態,並在指定的間隔之後再次嘗試作業。 如果作業無法進行,BITS 會將作業移至嚴重錯誤狀態。 使用 IBackgroundCopyJob::SetMinimumRetryDelay 和 IBackgroundCopyJob::SetNoProgressTimeout 方法來控制 BITS 如何處理暫時性錯誤。
對於前台作業,您應該限制作業在暫時性錯誤狀態的時間,並積極嘗試復原。 使用 SetNoProgressTimeout 方法來限制作業停留在暫時性錯誤狀態的時間量,或強制作業進入嚴重錯誤狀態。 如果您讓作業嘗試復原,您應該使用 SetMinimumRetryDelay 方法,將最小重試延遲設定為 60 秒,或呼叫 IBackgroundCopyJob::Resume 方法來重新啟動作業。
如需詳細資訊,請參閱 BG_JOB_STATE、BITS 作業 生命週期,以及 處理錯誤。
測量網路頻寬使用量
BITS 可能會使用用戶端的網路適配器來估計可用的網路頻寬。 由於 BITS 無法測量超出用戶端的頻寬,因此 BITS 可能會使 WAN 鏈接變擁擠。 若要減少 WAN 連結的壅塞,您可以使用 MaxInternetBandwidth 組策略來限制用戶端使用的頻寬量。 如需詳細資訊,請參閱 網路頻寬 和 組策略。
如果您正在撰寫讓許多用戶端用來從指定伺服器下載檔案的應用程式,您應該考慮採用一種方案,來錯開下載要求,以避免因過多要求而使伺服器過載。
設定代理伺服器和伺服器驗證的憑證
如果您預期 Proxy 或伺服器需要使用者認證,則必須將認證提供給 BITS。 若要指定認證,請呼叫 IBackgroundCopyJob2::SetCredentials 方法。 BITS 支援 Basic、Digest、Negotiate、NTLM 和 Passport 驗證方案。
如需驗證的詳細資訊,請參閱 驗證。
指定用戶帳戶和服務帳戶的 Proxy 設定
根據預設,BITS 會使用使用者的 Internet Explorer Proxy 設定。 若要覆寫使用者的 Internet Explorer Proxy 設定,請呼叫 IBackgroundCopyJob::SetProxySettings 方法。
Internet Explorer Proxy 設定不適用於系統帳戶,因此除非採取其他設定步驟,否則預設 Proxy 行為(BG_JOB_PROXY_USAGE_PRECONFIG)只能在 Web Proxy 自動探索通訊協定 (WPAD) 部署中正常運作。 如果您的應用程式是以 LocalSystem、LocalService 或 NetworkService 身分執行的服務,請考慮在 BITS 作業上設定輔助令牌,或透過呼叫 IBackgroundCopyJob::SetProxySettings 明確設定正確的代理伺服器設定,使用 BG_JOB_PROXY_USAGE_OVERRIDE。 或者,您可以使用 BitsAdmin.exe 的 /Util /SetIEProxy 參數來設定 LocalSystem、LocalService 或 NetworkService 系統帳戶的 Internet Explorer Proxy 設定。 如需詳細資訊,請參閱 BitsAdmin Tool。
BITS 無法辨識使用 Proxycfg.exe 檔案所設定的 Proxy 設定。
從 Windows 10 2018 年 10 月更新(10.0;版本 17763)開始,BITS 會使用與 WinHttp 搭配 AUTOMATIC_PROXY 所使用的相同代理伺服器順序。 當指定BG_JOB_PROXY_USAGE_PRECONFIG時,BITS 會使用此更相容的順序。 BG_JOB_PROXY_USAGE_PRECONFIG是指定 HTTP Proxy 的預設值。
為認證代理伺服器指定使用者特定的設定
如果您在需要 Proxy 驗證的環境中使用 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 7540,第 8.1.2 節)。 即使流量是以非小寫標頭傳送,代理伺服器也可能會選擇強制將標頭轉換為小寫。
避免個人識別資訊 (PII)
具有系統管理員許可權的所有使用者可以看到 BITS 作業,包括作業顯示名稱、描述和檔名。 它們也可以新增至 Windows 遙測。 您應該避免在作業詳細數據中放置敏感數據(例如使用者自己的名稱)。