Рекомендации по использованию BITS
В этом разделе содержатся сведения, которые следует учитывать при разработке приложения, использующего BITS.
Контекст пользователя или контекст службы
BITS передает файлы только при входе владельца задания на компьютер (пользователь должен войти в систему в интерактивном режиме). BITS не поддерживает команду RunAs. Дополнительные сведения см. в "Пользователи и сетевые подключения".
Если для приложения не требуется контекст пользователя, попробуйте создать службу, запущенную как LocalSystem, LocalService или NetworkService. Эти системные учетные записи всегда активны, поэтому передача не зависит от выхода пользователя из системы. Однако если при создании задания выступить от имени пользователя, применяются правила интерактивного входа. Дополнительные сведения см. в разделе служебных учетных записей иBITS.
Задания являются постоянными
Задания остаются в очереди, пока не вызовете метод IBackgroundCopyJob::Complete или IBackgroundCopyJob::Cancel. Файлы в задании недоступны пользователю, пока не вызовете Complete. Как правило, вы вызываете Complete, если состояние задания BG_JOB_STATE_TRANSFERRED, и вызываете Cancel, когда задание находится в состоянии BG_JOB_STATE_TRANSIENT_ERROR или BG_JOB_STATE_ERROR и больше не может продвигаться.
Если не вызывать метод Complete или метод Cancel в течение 90 дней (по умолчанию JobInactivityTimeout групповой политики), служба отменяет задание. Всегда следует вызывать метод Complete или метод Cancel, а не полагаться на политику JobInactivityTimeout для очистки ваших заданий. Задания, оставшиеся в очереди, могут препятствовать созданию других заданий, если достигнуто ограничение политики MaxJobsPerUser или MaxJobsPerMachine.
Когда следует использовать приоритет переднего плана или фона
Если задание не является критически важным или пользователь активно ожидает, всегда следует использовать фоновый приоритет. Однако иногда может потребоваться переключиться с фонового приоритета на приоритет переднего плана, например, если прокси-сервер не поддерживает заголовок Content-Range или антивирусное программное обеспечение на клиенте удаляет запрос заголовка диапазона. Переключение на приоритет переднего плана работает только для тех файлов, размер файла которых меньше 2 ГБ. Пример см. в реализации метода IBackgroundCopyCallback::JobError. Кроме того, обратите внимание, что если фоновое задание будет прервано из-за отключения сети или выхода пользователя, задание завершится ошибкой, так как BITS отправит запрос диапазона, чтобы попытаться перезапустить передачу с того места, на котором она остановилась.
Начиная с Windows 8, необходимо настроить задания загрузки с BITS_JOB_PROPERTY_DYNAMIC_CONTENT и BG_JOB_PRIORITY_FOREGROUND при нацеливании на серверы, не соответствующих требованиям HTTP для загрузки BITS. Помните, что это приведет к перезапуску загрузки BITS с самого начала, если он когда-либо прерывается (например, из-за проблем с подключением или перезагрузки системы).
Сведения о доступных приоритетах и о том, как BITS использует уровень приоритета для планирования заданий, см. в BG_JOB_PRIORITY.
Временные и неустранимые ошибки
Некоторые ошибки можно восстановить, а некоторые — нет. Например, ошибка "Сервер недоступен" является устранимой ошибкой, а ошибка "Отказано в доступе" является критической ошибкой. BITS помещает восстанавливаемые ошибки в временное состояние ошибки и пытается выполнить задание снова после указанного интервала. Если задание не удается выполнить, BITS перемещает задание в неустранимое состояние ошибки. Используйте IBackgroundCopyJob::SetMinimumRetryDelay и IBackgroundCopyJob::SetNoProgressTimeout, чтобы управлять тем, как BITS обрабатывает временные ошибки.
Для фоновых заданий необходимо ограничить время, которое позволяем заданию оставаться в состоянии временной ошибки и пытаться восстановить. Используйте метод SetNoProgressTimeout, чтобы ограничить время пребывания задания в состоянии временной ошибки или принудительно перевести задание в состояние неустранимой ошибки. Если задание попытается восстановиться, следует использовать метод setMinimumRetryDelay для установки минимальной задержки повторных попыток в 60 секунд или вызова метода IBackgroundCopyJob::Resume для повторного активации задания.
Дополнительные сведения см. в разделе BG_JOB_STATE, Жизненный цикл задания BITSи Обработка ошибок.
Измерение использования пропускной способности сети
BITS может использовать сетевой адаптер клиента для оценки доступной пропускной способности сети. Поскольку BITS не может измерять пропускную способность за пределами клиента, это может создать перегрузку канала WAN. Чтобы уменьшить перегрузку по каналу глобальной сети, можно использовать групповую политику MaxInternetBandwidth, чтобы ограничить объем пропускной способности, используемой клиентом. Дополнительные сведения см. в пропускной способности сети и групповых политик.
Если вы пишете приложение, которое многие клиенты будут использовать для скачивания файлов с заданного сервера, следует рассмотреть схему, которая застаит запросы на скачивание, чтобы не перегружать сервер запросами.
Настройка учетных данных для проверки подлинности прокси и сервера
Если вы ожидаете, что прокси-сервер требует учетных данных пользователя, необходимо указать учетные данные BITS. Чтобы указать учетные данные, вызовите метод IBackgroundCopyJob2::SetCredentials. BITS поддерживает схемы проверки подлинности Basic, Digest, Negotiate, NTLM и Passport.
Для получения подробностей о проверке подлинности см. в Аутентификация.
Указание параметров прокси-сервера для учетных записей пользователей и учетных записей служб
По умолчанию BITS использует параметры прокси-сервера Internet Explorer пользователя. Чтобы переопределить параметры прокси-сервера Internet Explorer пользователя, вызовите метод IBackgroundCopyJob::SetProxySettings.
Параметры прокси-сервера Internet Explorer не применяются к системным учетным записям, поэтому поведение прокси-сервера по умолчанию (BG_JOB_PROXY_USAGE_PRECONFIG) будет работать только в развертываниях протокола автоматического обнаружения веб-прокси (WPAD), если не предприняты дополнительные действия по настройке. Если приложение является службой, работающей как LocalSystem, LocalService или NetworkService, попробуйте настроить вспомогательный маркер в заданиях BITS или явно задать правильные параметры прокси-сервера, вызвав IBackgroundCopyJob::SetProxySettings с BG_JOB_PROXY_USAGE_OVERRIDE. Можно задать параметры прокси-сервера Internet Explorer для учетной записи системы LocalSystem, LocalService или NetworkService, используя команды /Util /SetIEProxy в BitsAdmin.exe в качестве альтернативы. Дополнительные сведения см. в разделе Средство BitsAdmin.
BITS не распознает параметры прокси-сервера, заданные с помощью файла Proxycfg.exe.
Начиная с обновления Windows 10 октября 2018 г. (10.0; Сборка 17763), BITS использует тот же алгоритм выбора прокси, что и WinHttp с AUTOMATIC_PROXY. BITS использует этот более совместимый порядок при указании BG_JOB_PROXY_USAGE_PRECONFIG. 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 7540, раздел 8.1.2). Даже если трафик отправляется с заголовками, не находящимися в нижнем регистре, прокси-серверы могут принудительно привести заголовки к нижнему регистру.
Избегайте личной информации, идентифицирующей личность (PII)
Задания BITS, включая отображаемое имя задания и описание и имена файлов, отображаются всем пользователям с правами администратора. Их также можно добавить в телеметрию Windows. Не следует помещать конфиденциальные данные (например, имя пользователя) в сведения о задании.