Bits transient error

Собственно проблема, BITS не качает обновления, при создании задание оно сразу же помечается как TRANSIENT_ERROR и все, ждал двое суток с приоритетом foreground. Выставлял права для пользователя Network Service, System на папки которые используются WSUS и BITS ничего не помогает. Если задание создается с приоритетом high, то он даже не коннектится к серверу для того чтобы получить размер, он сразу помечает его как TRANSIENT_ERROR, если с приоритетом foreground=1 то определяет размер и сразу же TRANSIENT_ERROR. За два дня не скачал ни байта.
  • Remove From My Forums
  • Общие обсуждения

  • Собственно проблема, BITS не качает обновления, при создании задание оно сразу же помечается как TRANSIENT_ERROR и все, ждал двое суток с приоритетом foreground. Выставлял права для пользователя Network Service, System на папки которые используются WSUS и BITS ничего не помогает. Если задание создается с приоритетом high, то он даже не коннектится к серверу для того чтобы получить размер, он сразу помечает его как TRANSIENT_ERROR, если с приоритетом foreground=1 то определяет размер и сразу же TRANSIENT_ERROR. За два дня не скачал ни байта. 

    • Изменен тип

      24 декабря 2009 г. 9:27

    • Изменен тип
      Vinokurov YuriyModerator
      24 декабря 2009 г. 9:31

title description ms.assetid ms.topic ms.date

Life Cycle of a BITS Job

The life cycle of a BITS job begins when you create a job.

b765a8ef-74bd-475e-9cd9-e9e2cf4f0305

article

11/13/2018

BITS Job states

There are four classes of BITS states: starting, action, transferred, and final. As a job runs, it transitions between states in the different state classes. Once a job is in a final state, it won’t move out of the final state and won’t show up in a job enumeration.

State-changing methods

There are four state-changing methods on a job: Cancel, Complete, Resume, and Suspend. As long as a job is not in a final state, you can call any of the state-changing methods.

The Suspend method is used to switch a job to the SUSPENDED state. When a job is suspended, all of its transfers will be stopped and won’t resume until you call Resume.
A job that’s already suspended will simply stay suspended.

The Resume method is used to start a job that’s suspended. Jobs in an error or transient error state will be set up to be retried. Jobs that are currently in an action state will stay in that state.

The Cancel method is used to cancel a job. The state will switch to cancelled. Any files currently being transferred will not be completed. All completely transferred and partially transferred files will be deleted.

The Complete method will finish a transfer. Any fully downloaded files will be kept; files that are not fully transferred will be deleted.

You must call either Cancel or Complete to move your job to a final state and be cleaned up. Jobs that aren’t transitioned to a final state will waste system resources. BITS will eventually automatically cancel old jobs. The default JobInactivityTimeout is to cancel jobs after 90 days.

Starting state

The starting state is SUSPENDED. From here, you can add files to the job and set job and file properties. To start a job transferring, call Resume on the job. If you resume a job with no files, it will return a BG_E_EMPTY error code and the job will stay suspended.

Action states

The QUEUED, CONNECTING and TRANSFERRING states show the current internal activity of your job. A job that’s QUEUED is ready to be scheduled, possibly waiting for the BITS scheduler or waiting for the user to log in. A job that’s CONNECTING is attempting to connect to the server to start transferring files. A job that’s TRANSFERRING is actively uploading or downloading your files.

The TRANSIENT ERROR state means that the job tried and failed to transfer the file. This might be for network policy reasons; the job might be blocked because the current network is too expensive. It might also be blocked for system reasons like the system being in battery saver or game mode, or because there’s no internet connectivity.

Jobs in the transient error state will be retried automatically by BITS when appropriate. BITS includes a MinimumRetryDelay and NoProgressTimeout value to control when a job is retried and when BITS will finally stop retrying.

Transferred states

The transferred states happen when there’s no more transferring to be done. You must either cancel or complete a job in this state. You may also add more files to transfer and call Resume(), but this isn’t a common practice.

The ERROR state happens when a transfer is done (it won’t be retried), but didn’t fully succeed. All the files must be transferred to be successful; if any have permanently failed the job will be in error. You will typically either call Cancel or Complete to move the job to a final state. The practical difference is that when you call Cancel, any successfully transferred file will be deleted, but if you call Complete, any successfully transferred file will not be deleted.

Reasons for being in an ERROR state include

  • Staying too long in a TRANSIENT ERROR state (beyond the NoProgressTimeout setting).
  • Getting a BG_E_TOKEN_REQUIRED error and needing assistance with helper tokens

It’s a common practice to reconfigure an ERROR’d job and then call Resume to retry the job. For example, your app might need to update a file’s remote name via SetRemoteName.

The TRANSFERRED state happens when a transfer is done and it succeeded. You must call Complete to finalize the job; for download jobs the downloaded files won’t be available until after you call Complete. The exception to this rule is jobs which are the high performance jobs (and you should still call Complete).

Final states

Once a job is in a final state, you can’t call any of the state-changing methods. The job will be ACKNOWLEDGED after you call Complete() and all completed downloaded files will be available. The job will be CANCELLED after you call Cancel() and all downloaded files will be deleted.

Life Cycle of a BITS job

The life cycle of a BITS job begins when you create a job. A job is a container that contains one or more files to transfer. A job also has properties that specify how BITS transfers the files and interacts with your application. For example, you can specify the priority of the job, whether the job is an upload or download job, and for which events you want to receive notification.

After you create the job, add one or more files (upload jobs can contain only one file) to the job and change any of the property values as appropriate for your application. When you add a file to the job, specify both the local (client) and remote (server) name of the file. The remote file name must use the HTTP, HTTPS, or SMB protocol. Files within a job are processed sequentially (first in, first out).

BITS automatically suspends jobs when they are created. You must resume the job to activate it in the transfer queue. You can suspend or resume a job at any time. Resuming the job moves the job from the suspended state to the queued state. The job stays in the queued state until the scheduler determines it is the job’s turn to transfer files. All foreground jobs run concurrently with one background job. BITS processes the files within foreground jobs serially.

When it is a job’s turn to transfer files, the job moves to the connecting state while BITS connects to the remote server (specified in the remote file name). If BITS is able to connect to the remote server, the job moves to the transferring state where it stays until its time slice ends, the transfer is complete, an error occurs, or the application suspends the job.

The job moves between the queued, connecting, and transferring states until BITS transfers all files in the job. At that point, the job moves to the transferred state. BITS uses round-robin scheduling to schedule jobs that are at the same priority level. Each job is given a slice of time to process its files. If the job does not complete during its time slice, the job goes back to the queued state and the next job in the queue is activated. This prevents large jobs from blocking smaller jobs. Jobs are processed largely on a first in, first out (FIFO) basis; however, BITS cannot guarantee FIFO processing because of round-robin scheduling, job errors, and service restarts.

The transferred files are not available to the client until the application calls the IBackgroundCopyJob::Complete method to transfer ownership of the files from BITS to the user. Upload jobs are also set to the transferred state when the file is successfully received by the server. Upload-reply jobs are set to the transferred state after the file is successfully sent to the server and the reply from the server application is successfully transferred to the client.

If an error occurs, the job moves to either the fatal or transient error state. Fatal errors are errors that BITS cannot recover from or which require intervention to fix. If the application is able to fix the error, the application resumes the job and BITS moves the job to the queued state. Transient errors are errors that may resolve themselves. BITS retries jobs in the transient error state until the transfer is successful or the job times out. The job times out when no progress is made within an application-specified period. If the job times out, BITS moves the job to fatal error state.

For more information on job states, see BG_JOB_STATE.

Незаметная, но интеллектуальная служба BITS

Объемы данных, передаваемых по сети современными приложениями, нередко достигают десятков или сотен мегабайт, а порой измеряются и гигабайтами. Это подчас приводит к заметному снижению пропускной способности сети. С другой стороны, постоянно растущее число мобильных пользователей или пользователей, вынужденных работать в условиях отсутствия надежных каналов связи с высокой пропускной способностью, заставляет задумываться над проблемой передачи больших объемов информации в сетях с неустойчивым или прерывающимся соединением. Например, вы можете начать передавать файл во время полета на самолете, но не успеть завершить процесс, а продолжить его из гостиничного номера. Или передача данных с буровой вышки может быть прервана из-за резкого ухудшения погодных условий.

Для решения этих и ряда других задач в состав Microsoft Windows 2003 Server включена новая служба — Background Intelligent Transfer Service (BITS). Она предназначена для передачи информации в фоновом режиме по ненадежным соединениям. Основные преимущества, предоставляемые этой службой, описаны во врезке «Зачем нужна BITS»

Специалисты Microsoft позаботились о разработчиках программного обеспечения и предложили специальный SDK, предназначенный для написания приложений, которые используют новую службу. Данная статья посвящена технологии и архитектуре BITS, а также интерфейсам программирования и приемам работы с ними, необходимым для использования возможностей службы BITS в приложениях. Материал, посвященный службе BITS, «Background Intelligent Transfer Service», можно найти на сайте MSDN по адресу http://msdn.microsoft.com/library/default.asp?url=/
library/en-us/bits/bits/bits_start_page.asp

Знакомство

BITS — это служба, предназначенная для передачи данных между клиентом и сервером. В отличие от других протоколов, BITS по умолчанию передает файлы в фоновом режиме, использующем для передачи информации только ситуации низкого сетевого трафика. Для реализации этой функции служба проверяет состояние сети и использует ее в моменты наименьшей загрузки. Также существенным отличием BITS от других механизмов передачи является асинхронный алгоритм работы, который позволяет приложению, инициировавшему передачу файлов, прекратить работу в то время, когда информация еще не передана. После генерации задания на передачу файла пользователь может прекратить выполнение приложения, а уже BITS осуществит передачу данных. Если пользователь, инициировавший передачу файла, закроет свою сессию работы на компьютере, процесс передачи будет приостановлен и возобновлен только после следующей регистрации пользователя в системе. Если задание создано системной службой, выполняющейся под определенной учетной записью (например, LocalSystem) и не требующей регистрации пользователя, то оно будет выполняться во время работы службы.

В операционную систему Microsoft Windows XP включена поддержка BITS версии 1.0, которая поддерживает только получение файлов (download), но не их передачу (upload). Версия BITS 1.5, поддержка которой включена в операционную систему Windows Server 2003, поддерживает двунаправленную передачу файлов. Также версия 1.5 может быть дополнительно установлена для Windows 2000 и Windows XP. В этой статье будет рассматриваться версия BITS 1.5.

Для осуществления передачи файлов должен быть установлен сервер Internet Information Services (IIS) версии 5.0 или 6.0 с серверными расширениями BITS. Версия IIS 5.1, входящая в поставку Windows XP, не поддерживается. Соответствующие обновления можно получить на сайте Microsoft.

Программный интерфейс ориентирован на использование в программах, разрабатываемых на языке C++, и входящие в него заголовочные и библиотечные файлы, а также справочные материалы входят в поставку SDK.

Служба BITS поддерживает протоколы HTTP и HTTPS для получения и загрузки файлов и требует сервера HTTP версии 1.1. Для получения файлов HTTP серверный метод Head должен возвращать размер файла в байтах, а метод Get должен поддерживать заголовки Content-Range и Content-Length. Для передачи динамической информации приложения ASP, ISAPI или CGI также должны поддерживать заголовки Content-Range и Content-Length. В противном случае возможна передача только статической информации. В табл. 1 приведено сравнение BITS и других механизмов, используемых для передачи файлов.

Конечно же, служба BITS может осуществлять и простую передачу файлов между каталогами. На листинге 1 приведен пример функции, которая выполняет простое копирование файлов. Приложение контролирует весь процесс передачи данных, т. е. не является асинхронным.

Перед тем как вкратце описать принципы действия программы, определим терминологию, используемую в API службы BITS. Основной термин, который применяется при описании работы BITS, — «задание» (Job). Это логический контейнер, объединяющий один или несколько файлов, предназначенных для передачи. Все файлы, входящие в задание, имеют одинаковый приоритет. Все задания объединяются в одну очередь заданий (Queue). Задания, помещенные в очередь, выполняются последовательно, т. е. одновременно не может передаваться более одного файла. Если выполнение задания по той или иной причине приостановлено, выполняется следующее задание с наиболее высоким приоритетом. Под файлом (File) понимается объект, имеющий два основных параметра — удаленное (Remote) и локальное (Local) имена. В зависимости от типа задания файл будет либо передан на удаленный ресурс, либо скопирован оттуда.

Программные интерфейсы BITS

Для разработки клиентских приложений специалисты Microsoft создали API, представляющий собой несколько COM-интерфейсов. Это делает API независимым от применяемых средств разработки. В том числе возможно использование функций, представляемых службой BITS в сценариях. Интерфейсы API, необходимые для передачи файлов и обеспечения управления процессом их копирования, приведены в табл. 2.

Рассмотрим пример из листинга 1. В первую очередь создается экземпляр интерфейса IBackgroundCopyManager. Он обеспечит доступ ко всем прочим необходимым интерфейсам. Далее используется метод IBackground CopyManager::CreateJob для создания задания и метод AddFile интерфейса IBackgroundCopyJob для инициализации процесса передачи файла. При создании задания указывается, каким образом оно будет применяться. Возможны три варианта значения параметра Type, имеющего тип BG_JOB_TYPE:

BG_JOB_TYPE_DOWNLOAD — определяет, что задание будет использовано для получения данных на стороне клиентского приложения.

BG_JOB_TYPE_UPLOAD — определяет, что задание будет использовано для передачи (загрузки) данных на сервер. Это значение доступно в версии BITS 1.5.

BG_JOB_TYPE_UPLOAD_REPLY — определяет, что задание будет использовано для передачи (загрузки) данных на сервер и получения файла ответа от серверного приложения. Это значение также доступно в версии BITS 1.5.

Также замечу, что выполнение задания после создания приостанавливается. Для продолжения и наблюдения за ходом выполнения задания используется периодический опрос его состояния. Текущий статус задания возвращает метод GetState интерфейса IBackgroundCopyJob. Статус может принимать следующие значения:

BG_JOB_STATE_QUEUED — показывает, что задание находится в очереди и ожидает выполнения. Если пользователь выйдет из системы до завершения задания, оно будет переведено в это состояние.

BG_JOB_STATE_CONNECTING — показывает, что служба BITS пытается установить соединение с сервером. Если соединение успешно установлено, состояние задания переходит в состояние BG_JOB_STATE_TRANSFERRING, в противном случае будет возвращено значение BG_JOB_STATE_TRANSIENT_ERROR.

BG_JOB_STATE_TRANSFERRING — показывает, что BITS передает информацию, помещенную в задание.

BG_JOB_STATE_SUSPENDED — показывает, что выполнение задания приостановлено. Для перевода в это состояние вызывается метод IBackgroundCopyJob::Suspend. Как я уже отметил выше, служба BITS автоматически приостанавливает задание после его создания. Задание будет находиться в приостановленном состоянии, пока не будет вызван один из методов: IBackgroundCopyJob::Resume, IBackgroundCopyJob::Complete или IBackgroundCopyJob::Cancel.

BG_JOB_STATE_ERROR — показывает, что при выполнении задания возникла критическая ошибка, приводящая к невозможности передачи файла. Когда ошибка будет исправлена, например изменены настройки системы, приводящие к запрещению доступа, вызов метода IBackgroundCopyJob::Resume продолжит выполнение задания. Если ошибка не может быть исправлена, вызов метода IBackgroundCopyJob:

:Cancel прервет выполнение задания, а вызов метода IBackground CopyJob::Complete позволит продолжить передачу других файлов, входящих в задание, и посчитать эту часть успешно завершенной.

BG_JOB_STATE_TRANSIENT_ERROR — показывает, что возникла некритическая ошибка. Служба BITS будет пытаться продолжить передачу данных в течение времени, установленного при вызове метода IBackgroundCopyJob::SetNoProgressTimeout. Если в течение этого времени передача не продолжится, статус задания поменяется на BG_JOB_STATE_ERROR.

BG_JOB_STATE_TRANSFERRED — показывает, что задание успешно завершено. Для заданий, предполагающих получение файлов клиентом, после перехода в это состояние необходимо вызвать метод IBackgroundCopyJob::Complete для предоставления клиентам доступа к полученным файлам.

BG_JOB_STATE_ACKNOWLEDGED — показывает, что клиентским приложением был вызван метод IBackgroundCopyJob::Complete, подтверждающий, что задание успешно выполнено.

BG_JOB_STATE_CANCELLED — показывает, что выполнение задания было прервано клиентским приложением с помощью вызова метода IBackgroundCopyJob::Cancel, который прерывает выполнение задания и удаляет его из очереди.

На рис. 1 показан жизненный цикл задания. Он начинается с генерации задания, это функция клиентского приложения. Задание представляет собой логический контейнер, содержащий файлы для передачи. После создания задания к нему добавляется один или несколько файлов для передачи. Важно! Обращаю внимание читателей на то, что в задание, предназначенное для передачи файлов на сервер, может быть помещен лишь один файл.


Рисунок 1. Жизненный цикл задания

Служба BITS автоматически приостанавливает задание после его создания. После активизации задания начинается передача информации. Задание выполняется успешно в случае передачи файлов, но может быть и прервано клиентским приложением.

Приведенной информации вполне достаточно для написания простых приложений, использующих службу BITS для передачи и получения файлов.

Но, безусловно, больший интерес представляет возможность осуществлять обмен информацией с HTTP-сервером. Рассмотрим, как происходит такой обмен, каким образом настраивается сервер для реализации этих возможностей, как реализуются серверные и клиентские приложения.

Для использования возможности загрузки файлов на сервер необходимо создать на сервере виртуальную папку, в которую клиенты будут передавать информацию. Виртуальные каталоги создаются для каждого типа обслуживаемых сервером клиентов. Например, для мобильных клиентов, использующих медленные каналы передачи данных, может потребоваться большее время ожидания, чем для клиентов из локальной сети, или может понадобиться ограничение размера данных, которые пользователи смогут размещать на сервере.

Компоненты службы BITS добавляют свойства в базу метаданных IIS. Для создаваемых виртуальных папок эти свойства используются для определения порядка размещения файлов.

Чтобы использовать службу BITS для передачи данных на сервер, необходимо настроить серверные расширения BITS для IIS и разрешить запись в каталоги. Для этого можно воспользоваться предоставляемыми BITS программными API или произвести настройки вручную, открыв окно настройки свойств виртуального каталога в консоли управления IIS.

В табл. 3 приведены параметры, используемые службой Background Intelligent Transfer Service для расширения возможностей IIS по поддержке функций загрузки файлов. В таблице описаны параметры, добавляемые BITS в базу метаданных IIS, относящиеся к виртуальному каталогу. Служба BITS использует эти параметры для определения правил загрузки файлов. Отметим, что под серверным приложением подразумевается приложение CGI, ASP или ISAPI, которое используется при обмене.

Пример, приведенный в листинге 2, включен в SDK и показывает, как установить свойства расширений IIS, используя Windows Scripting Host. Если виртуальный каталог является ссылкой на удаленный ресурс, то кроме приведенных еще устанавливаются значения свойств UNCUserName и UNCPassword.

Взаимодействие с серверными приложениями

Служба BITS использует приведенные в табл. 4 заголовки запросов HTTP для передачи информации серверным приложениям. BITS с помощью параметра BITSServerNotificationType определяет заголовок (header), который будет использоваться. Если параметр BITSServerNotificationType имеет значение 1, BITS передает местоположение загружаемого файла в заголовке. Если параметр BITSServerNotificationType имеет значение 2, BITS передает тело файла в заголовке запроса.

Передача загружаемого файла в теле запроса позволяет существующим приложениям работать с минимальной модификацией кода. Загружаемый и получаемый файлы передаются соответственно в теле запроса и ответа. В следующем примере показано, как служба BITS передает загружаемый файл на серверное приложение в теле запроса.

и далее следуют 80 000 байт передаваемого файла

А так выглядит ответ серверного приложения:

HTTP/1.1 200 — OK

Content-Length: 100

и далее идут 100 байт возвращаемой информации.

Служба BITS передает расположение загружаемого файла и файла ответа в параметрах. Серверное приложение открывает загружаемый файл, обрабатывает данные и создает файл ответа. Затем BITS удаляет загружаемый файл и файл ответа после получения ответа от серверного приложения. Если серверному приложению требуются эти файлы в дальнейшем, они должны быть скопированы в другое место. В следующем примере запроса показано, как BITS передает адрес загружаемого файла серверному приложению:

POST http://myserver/myvdir/handle_upload.asp?ACCOUNT=873112 HTTP/1.1

Host: myserver

BITS-Original-Request-URL: http://front-end-server/vdir

BITS-Request-DataFile-Name: c:physical-pathBITS-Sessions
{5e53c221-f2d6-4bf2-

b994-1dc43ceaca8d}
equest

BITS-Response-DataFile-Name: c:physical-pathBITS-Sessions
{5e53c221-f2d6-4bf2-

b994-1dc43ceaca8d}
esponse

Content-Length: 0

А это текст ответа серверного приложения службе BITS; возвращаемая информация находится в файле, определенном параметром BITS-Response-DataFile-Name запроса.

HTTP/1.1 200 — OK

Content-Length: 0

Заметим, что BITS не может осуществить запись файлов в виртуальную папку, для которой разрешены запуск сценариев и программ. Если попытаться записать файлы в такую папку, будет возвращена ошибка. BITS не требует разрешения на запись в виртуальный каталог; более того, рекомендуется вводить запрет на запись.

Настройки, устанавливаемые по умолчанию, позволяют осуществлять запись файлов на сервер. Для записи файлов на сервер и отправки последующего уведомления о завершении процесса необходимо разрешить BITS уведомлять о событиях и указать URL серверного приложения, которое должно быть вызвано. Как правило, это расширение ISAPI. Служба BITS осуществит передачу данных и оповестит сервер. Для этого она использует запросы и ответы, предусмотренные протоколом HTTP для связи с серверным приложением.

Обмен информацией

Выше рассматривалось простое приложение, позволяющее передать файлы. Теперь можно рассмотреть другие интерфейсы, предоставляемые службой BITS. Размещение файла в очереди заданий происходит одним способом, и он уже был рассмотрен. Но получение информации о ходе передачи может осуществляться не только с помощью опроса состояния задания, как было показано в листинге 2.

Реализация интерфейса IBackgroundCopyCallback позволяет получать уведомления о завершении задания, возникших ошибках или изменении его статуса. Клиентское приложение может использовать это решение вместо опроса состояния очереди. Я написал класс, описание которого можно найти в листинге 3, реализующий необходимый интерфейс. Для получения уведомлений нужно передать указатель на объект этого класса с помощью метода IBackgroundCopyJob::SetNotifyInterface. Служба BITS будет использовать этот указатель в течение всего срока жизни приложения. Когда приложение будет запущено вновь, указатель необходимо восстановить. Гарантирован как минимум один вызов после повторной регистрации. Например, если приложение было завершено до завершения задания, то после его повторного старта, даже если он имел место после выполнения задания, произойдет уведомление о завершении. Необходимо реализовать все методы интерфейса IBackground

CopyCallback. Если метод ничего не делает, он должен возвращать значение S_OK. Чтобы определить, оповещения о каких событиях необходимо доставлять в приложение, используется метод IBackgroundCopyJob:

:SetNotifyFlags, которому передается один параметр, состоящий из одного или нескольких флагов:

BG_NOTIFY_JOB_TRANSFERRED — флаг показывает, что оповещение должно быть передано, когда все файлы в задании успешно переданы.

BG_NOTIFY_JOB_ERROR — оповещение об ошибках.

BG_NOTIFY_DISABLE — это значение запрещает службе BITS передавать уведомления о событиях. Все остальные флаги будут проигнорированы.

BG_NOTIFY_JOB_MODIFICATION — состояние задания изменилось. Например, изменился приоритет задания, статус задания или произошло изменение объема переданной информации. Этот флаг игнорируется, если оповещения передаются внешнему приложению (см. ниже).

В листинге 4 показана простая реализация методов класса, принимающего оповещения о событиях.

На рис. 2 показана диаграмма состояний задания. Заметим, что на диаграмме не отражено состояние CANCELED. Так как в него задание может перейти из любого другого состояния, кроме ACKNOWLEDGED, для наглядности я не стал его изображать.


Рисунок 2. Диаграмма состояний задания

В состояние SUSPENDED задание переходит либо сразу после создания, либо после вызова метода IBackgroundCopyJob::Suspend. В это состояние задание может перейти из любого другого, кроме состояний CANCELED или ACKNOLEDGED.

Если задание переходит в состояние ERROR, то оно может быть перезапущено после устранения ошибки. И наконец, если задание находится в состоянии TRANSIENT ERROR, служба BITS пытается восстановить задание автоматически.

Кроме описанных способов уведомления о событиях, BITS предоставляет еще одну интересную возможность. Можно определить приложение (исполняемый файл), которое будет вызвано при наступлении того или иного события. Для этого используется интерфейс IBackground CopyJob2, указатель на который возвращается вызовом метода IBackgroundCopyJob::ueryInterface (см. листинг 5).

Далее вызовом метода IBackground

CopyJob2::SetNotifyCmdLine указывается приложение, которое должно быть вызвано, и передаваемые ему параметры командной строки. Заметим, что первым параметром должен быть путь к приложению. Вообще говоря, достаточно использовать еще один параметр — идентификатор задания, получаемый при его создании. В отличие от механизма уведомления о событиях, здесь возможно уведомление лишь об ошибках, возникших в процессе выполнения задания, и о завершении задания. Так же как и в предыдущем случае, типы событий, о которых необходимы уведомления, устанавливаются вызовом метода IBackgroundCopyJob:

:SetNotifyFlags. В том случае если ранее был установлен указатель на интерфейс приема информации о событиях, будет возвращена ошибка.

Приложение, которое будет вызвано в случае наступления указанных событий, может восстановить указатель на IBackgroundCopyJob вызовом метода IBackgroundCopyManager:

:GetJob (напомню, что второй параметр командной строки содержит GUID, идентифицирующий задание), примерно так:

hr = CLSIDFromString( argv[1],&JobId );

if( SUCCEEDED(hr) )

{

hr = pManager->GetJob( JobId,&pJob );

}

и далее использовать методы этого интерфейса в соответствии с логикой программы.

Интерфейс управления

Для управления свойствами виртуального каталога, отвечающими за взаимодействие с BITS, используется интерфейс IBITSExtensionSetup, который, в частности, позволяет разрешить или запретить запись файлов BITS в виртуальный каталог. Этот интерфейс представляет собой расширение интерфейсов Active Directory, ADSI. Получить указатель на данный интерфейс можно вызовом функции ADsGetObject:

HRESULT hr = IBITSExtensionSetup* pExtensionSetup = NULL;

hr = ADsGetObject( pszPath,__uuidof(IBITSExtensionSetup),&pExtensionSetup );

if( SUCCEEDED(hr) )

{

}

Но если этот интерфейс используется из программы, которая также запускает сервер BITS, например из программы установки, необходимо использование метода IBITSExtension

SetupFactory::GetObject для получения указателя на этот интерфейс. В остальных случаях возможно применение любого метода.

Интерфейс предоставляет следующие методы.

EnableBITSUploads — разрешает службе BITS загружать файлы в виртуальный каталог.

DisableBITSUploads — запрещает службе BITS загружать файлы в виртуальный каталог.

GetCleanupTaskName — возвращает имя задания, выполняющего очистку виртуального каталога.

GetCleanupTask — возвращает интерфейс задания, выполняющего очистку виртуального каталога. Это задание удаляет обработанные файлы. Когда создается виртуальный каталог и разрешается запись в него файлов, служба BITS добавляет задание, которое очищает каталог один раз в 12 часов и удаляет задания на передачу файлов, которые в течение этого времени не изменялись. Для определения периода ожидания, в течение которого файлы не будут удалены, необходимо установить свойство BITSSessionTimeout расширений IIS.

В листинге 6 приведен пример функции, разрешающей или запрещающей запись файлов в виртуальный каталог.

Читатели могут спросить, зачем использовать новый сложный API для решения, казалось бы, простых и давно известных задач? Дело в том, что служба BITS позволяет решать совсем не тривиальные задачи. Точнее, ее версия 1.5. Если внимательно просмотреть разделы, описывающие обмен информацией с серверными приложениями, станет понятно, что BITS ориентирована на асинхронный обмен динамическим контентом в среде IIS. Такая возможность, безусловно, стоит изучения нескольких интерфейсов. Кроме того, прямое назначение службы — обмен файлами — может помочь решить огромное количество проблем, возникающих, например, при интеграции распределенных приложений или при передаче больших объемов данных.


Зачем нужна BITS

Использование службы BITS предоставляет следующие преимущества, которые существенно изменяют процесс обмена файлами.

  1. Передача данных в фоновом режиме.
  2. Восстановление прерванной передачи.
  3. Управляемость процесса.
  4. Безопасность.
  5. Установка приоритетов при передаче данных.

Александр Эпштейн (alex_ep@hotmail.com) — независимый консультант и разработчик программного обеспечения

Содержание

  1. BITS что это за служба в Windows?
  2. BITS Administration Utility (bitsadmin.exe)
  3. Вирус может использовать BITS
  4. Как исправить проблемы фоновой интеллектуальной службы передачи (BITS) в Windows 10
  5. Как исправить проблемы с битами с помощью устранения неполадок
  6. Как исправить проблемы с битами, используя SFC и DISM
  7. Как исправить проблемы BITS с помощью последнего обновления
  8. Определить последнее обновление
  9. Определить тип системы
  10. Загрузка последнего обновления
  11. Установка обновления вручную
  12. Больше ресурсов по Windows 10
  13. Мауро рекомендует все эти доступные аксессуары
  14. Logitech MX Master Wireless Mouse ($ 72 в магазине Amazon)
  15. Расширенный игровой коврик для мыши Ktrio (12 долларов на Amazon)
  16. Супер ночь светодиодная лента (20 долларов на Amazon)
  17. Background Intelligent Transfer Service
  18. Служба передачи данных
  19. Знакомство
  20. Программные интерфейсы BITS
  21. Взаимодействие с серверными приложениями
  22. Обмен информацией
  23. Интерфейс управления
  24. Зачем нужна BITS

BITS что это за служба в Windows?

170628161746BITS — интеллектуальная служба передачи данных между клиентом и HTTP-сервером. При этом при передачи используется интернет, который не используется. Как это? Например у вас интернет-пакет со скоростью 10 мегабит, а вы просто сидите в социальной сети, которая ну никак не может для отправки сообщений использовать все 10 мегабит. И вот то, что не используется — то может взять себе служба BITS для передачи данных) вот как-то так все и работает)

Но где эта служба применяется? Самое главное применение — загрузка обновлений с серверов Microsoft. Обновления могут быть большие и вот чтобы загрузка их не мешала пользователю в плане скорости — то и нужна служба BITS. Вот поэтому то он и интеллектуальная — качает с такой скоростью, чтобы вам не мешать сидеть на сайтах, или например играть в онлайн игру..)

Как я понимаю, основная фишка службы BITS — фоновая загрузка данных, при которой используется не вся скорость интерната, а только неиспользуемая.

Кроме обновлений служба также используется и в антивирусе Microsoft Security Essentials (Windows Defender).

Как я понимаю, эту службу могут использовать и другие программы. Они могут загружать файлы из интернета при помощи этой службы. Для этого программа создает задание, в котором указаны файлы, и потом это задание идет или в очередь или сразу выполняется. В общем это уже больше для разработчиков, вряд ли вам интересно)

Нужно ли отключать службу BITS? Судя по тому где она используется — нет, отключать не стоит, иначе могут быть проблемы со встроенным антивирусом или с обновлениями. Но если вы ни первым ни другим не пользуетесь — то получается отключить можно. Но опять же, а если еще какая-то программа использует эту службу? Нельзя ведь точно знать какие проги используют, а какие нет. Поэтому.. нет, лучше все таки ее не отключать. Тем более что вряд ли она может грузить ПК — разве что совсем немного и только когда идет передача данных.

Чтобы отключить службу или посмотреть, включена она или нет, то нужно открыть окошко свойств — там есть вся необходимая информация. Как это сделать? А вот как — зажимаете Win + R, вставляете эту команду:

Нажимаете ОК и потом в списке служб находите Фоновая интеллектуальная, нажимаете два раза и будет окошко свойств. Там все будет сказано. Чтобы отключить — в Тип запуска выбираете Отключена и нажимаете кнопку Остановить. Но отключать в итоге все таки думаю что не стоит.

Как и многие системные службы, BITS работает под процессом svchost.exe, тут ничего удивительного нет.

Проверка состояния службы BITS

181025062628 pre 181025062647 pre

181025062628

181025062647

BITS Administration Utility (bitsadmin.exe)

BITS Administration Utility — инструмент управления службой BITS. Возможно что инструмент из себя представляет команду, так как имеет параметры для запуска из командной строки:

181025064541

Да, bitsadmin.exe — это команда:

181025065907

Я точно не знаю — но если интересно, то можете попробовать ввести в командную строку:

И в результате может отобразиться справка по этой команде.

Вирус может использовать BITS

Но я нашел еще кое-что интересное. Впрочем ничего странного нет.. в общем вирусы тоже могут использовать службу BITS. На одном сайте читаю, что некий троян в 2016 году использовал функционал службы для загрузки вирусов на ПК. Ну тут просто без комментариев, я то думал что там в Microsoft это учли и сделали так, что загрузка могла бы быть только с безопасных источников. Но как видим — нет.

Сегодня тот вирус уже вряд ли опасен — информация за 2016 год, а сейчас конец 2018, и скорее всего вирус уже внесен в антивирусные базы.

Нашел даже более точную информацию — вирус назывался Zlob.Q и он использовал BITS для связи с командным центром (C&C). И как обнаружили этот вирус? Все очень просто — была подозрительная активность службы BITS, ну и начали копать, и в итоге докопались.

Возможно у вас тоже есть подозрительная активность? В любом случае, при малейшем подозрении — проверьте ПК на вирусы. Чем? Я перечислю две основные утилиты, которыми стоит проверять регулярно ПК:

Вот этими двумя утилитами я оч советую проверить ПК при малейшем подозрении на вирус. На этом все — удачи, надеюсь информация помогла.

Источник

Как исправить проблемы фоновой интеллектуальной службы передачи (BITS) в Windows 10

fix bits background intelligent transfer service windows10

В Windows 10 фоновая интеллектуальная служба передачи (BITS) является важным компонентом, отвечающим за помощь системе и приложениям во время основной или фоновой загрузки и выгрузки между устройством и удаленным сервером, не влияя на работу сети. Это достигается за счет интеллектуальной обработки приоритетов и регулирования, а также автоматической приостановки и возобновления передачи данных.

Хотя это интеллектуальная функция, иногда служба внезапно перестает работать, что препятствует правильной работе Центра обновления Windows, Магазина Microsoft и других служб.

Если в вашей установке Windows 10 возникли проблемы с этим компонентом, вы можете использовать средство устранения неполадок фоновой интеллектуальной службы передачи, автономный установщик Центра обновления Windows (WUSA) и инструменты командной строки, такие как средство проверки системных файлов (SFC) и обслуживание образа развертывания и управление им ( DISM) для решения наиболее распространенных проблем.

В этом руководстве по Windows 10 мы расскажем вам о трех способах устранения неполадок и устранения распространенных проблем, когда BITS работает неправильно.

Как исправить проблемы с битами с помощью устранения неполадок

Чтобы исправить типичные проблемы с BITS в Windows 10, выполните следующие действия:

troubleshooting controlpanel

hardware sound troubleshooter

bits windows 10 troubeshooter

background intelligent transfer service troubleshooter

troubleshooter detailed information

Просмотрите подробности обнаружения.

bits troubleshooter detection details

После выполнения этих действий средство устранения неполадок будет сканировать, обнаруживать и исправлять любые проблемы (включая перезапуск службы при необходимости), которые могут мешать правильной работе BITS.

Как исправить проблемы с битами, используя SFC и DISM

Если у вас по-прежнему возникают проблемы из-за проблем с установкой Windows 10, вы можете использовать инструмент командной строки SFC и DISM, чтобы попытаться устранить проблему с помощью BITS.

Чтобы использовать DISM и SFC для устранения проблем с битами, выполните следующие действия:

Введите следующую команду, чтобы просканировать и исправить любые повреждения системных файлов, и нажмите Enter :

dism /Online /Cleanup-Image /RestoreHealth

fix bits dism windows 10

Введите следующую команду для запуска инструмента и нажмите Enter :

fix bit sfc scannow

После того, как вы выполните эти шаги, DISM будет сканировать и восстанавливать системные файлы, а инструмент SFC будет сканировать и пытаться решить общие проблемы с вашей установкой Windows 10, что также может помочь исправить менеджер загрузки системы.

Как исправить проблемы BITS с помощью последнего обновления

Если ни одна из вышеперечисленных рекомендаций не помогла исправить BITS, это может быть проблема с Windows 10, которую можно исправить, установив последнее качественное обновление с веб-сайта каталога Центра обновления Майкрософт вручную.

Чтобы установить последнее обновление, выполните следующие действия.

Определить последнее обновление

windows update history page

Определить тип системы

Чтобы узнать, требуется ли вашему устройству 32-разрядная или 64-разрядная версия обновления, выполните следующие действия.

Подтвердите, нужны ли вам 32-разрядные или 64-разрядные обновления.

determine 32 64 bit windows 10

Загрузка последнего обновления

Чтобы загрузить обновление Windows вручную, выполните следующие действия.

Нажмите кнопку « Загрузить» для получения 64-разрядной или 32-разрядной версии обновления.

download windows update manually

Установка обновления вручную

Введите следующую команду для запуска инструмента и нажмите Enter :

install update manually windows 10

wusa C:FOLDER-PATHUPDATE-NAME.msu /quiet /norestart

В команде обязательно обновите путь и имя обновления, чтобы успешно выполнить команду.

После выполнения этих шагов перезагрузите компьютер, и служба менеджера загрузки системы должна снова начать работать.

Это руководство ориентировано на Windows 10, но вы также можете обратиться к этим шагам, чтобы исправить проблемы с фоновой интеллектуальной службой передачи в Windows 8.1 и Windows 7.

Больше ресурсов по Windows 10

Для получения более полезных статей, обзоров и ответов на распространенные вопросы о Windows 10 посетите следующие ресурсы:

Мауро рекомендует все эти доступные аксессуары

Привет, я Мауро Хуулак, помощник Windows Central и практический гуру. Я написал пост, который вы сейчас читаете, и я знаю ОС Windows от и до. Но я также немного фанат аппаратных средств. Вот некоторые из доступных гаджетов на моем столе сегодня.

Logitech MX Master Wireless Mouse ($ 72 в магазине Amazon)

Я знаю мышей, и этим я пользуюсь каждый день. MX Master — это беспроводная высокоточная мышь, которая очень удобна в использовании и имеет множество замечательных функций, в том числе возможность подключения к нескольким устройствам, бесконечное колесо прокрутки, кнопки «назад» и «вперед», которые вы можете настраивать.

logitech mx master mouse 41h8

Расширенный игровой коврик для мыши Ktrio (12 долларов на Amazon)

Если вы будете печатать много времени, ваши ладони и мышь оставят следы на вашем столе. Мое решение состояло в том, чтобы начать использовать игровые коврики для мыши, которые достаточно велики, чтобы вы могли комфортно пользоваться клавиатурой и мышью. Это тот, который я использую и рекомендую.

gaming pad ktrio amazon 0

Супер ночь светодиодная лента (20 долларов на Amazon)

Вы можете просто использовать обычную лампочку в своем офисе, но если вы хотите добавить немного окружающего освещения с разными цветами, лучше использовать светодиодную ленту RGB. Этот одобрен Mauro.

led strip amazon image 0

Мы можем заработать комиссию за покупки, используя наши ссылки. Узнайте больше

Источник

Background Intelligent Transfer Service

Вы все еще не знаете, как лучше организовать передачу файлов по сети на компьютеры под управлением Windows? Тогда вам сюда!

Background Intelligent Transfer Service (BITS) – служба ОС Windows, которая может передавать файлы в фоновом режиме. Она используется, в основном, для Windows Update.

Какой же интерес BITS представляет для разработчиков?

1. Возможность закачки файлов в фоновом режиме, незаметно для пользователя
2. Высокий уровень отказоустойчивости. Если сетевой кабель перерубят, или комп выпадет в «синий экран», то BITS докачает файлы, как только это станет возможно.
3. Intelligent сказано не зря. Если пользователь в данный момент ничего не качает и комп простаивает, BITS воспользуется освободившимися ресурсами. Эту фичу можно использовать, назначая различные приоритеты закачек.

Работать с BITS можно через специальный API

Ключевым объектом BITS является Job (не надо дословного перевода, назовем это «закачкой»).
Жизненный цикл «закачки» следующий:

1. Создание Job. Указываем название, описание, тип (UploadDownload) и приоритет

2. Добавление файлов. Job может содержать несколько файлов, если выбран тип Download.

3. Подписываемся на события закачки, если необходимо отслеживать прогресс в реальном времени.

4. Запуск закачки. Далее BITS все делает сам.

Важной особенностью BITS является то, что создать закачку может только пользователь, совершивший вход в систему, либо системная учетная запись. Тем, кто собирается использовать BITS, советую не забывать об этом.

Я сознательно не привожу примеров кода, они есть здесь и здесь.

Для дополнительного ознакомления есть замечательная статья на английском.

Источник

Служба передачи данных

Незаметная, но интеллектуальная служба BITS

087 0

Объемы данных, передаваемых по сети современными приложениями, нередко достигают десятков или сотен мегабайт, а порой измеряются и гигабайтами. Это подчас приводит к заметному снижению пропускной способности сети. С другой стороны, постоянно растущее число мобильных пользователей или пользователей, вынужденных работать в условиях отсутствия надежных каналов связи с высокой пропускной способностью, заставляет задумываться над проблемой передачи больших объемов информации в сетях с неустойчивым или прерывающимся соединением. Например, вы можете начать передавать файл во время полета на самолете, но не успеть завершить процесс, а продолжить его из гостиничного номера. Или передача данных с буровой вышки может быть прервана из-за резкого ухудшения погодных условий.

Для решения этих и ряда других задач в состав Microsoft Windows 2003 Server включена новая служба — Background Intelligent Transfer Service (BITS). Она предназначена для передачи информации в фоновом режиме по ненадежным соединениям. Основные преимущества, предоставляемые этой службой, описаны во врезке «Зачем нужна BITS»

Специалисты Microsoft позаботились о разработчиках программного обеспечения и предложили специальный SDK, предназначенный для написания приложений, которые используют новую службу. Данная статья посвящена технологии и архитектуре BITS, а также интерфейсам программирования и приемам работы с ними, необходимым для использования возможностей службы BITS в приложениях. Материал, посвященный службе BITS, «Background Intelligent Transfer Service», можно найти на сайте MSDN по адресу http://msdn.microsoft.com/library/default.asp?url=/ library/en-us/bits/bits/bits_start_page.asp

Знакомство

BITS — это служба, предназначенная для передачи данных между клиентом и сервером. В отличие от других протоколов, BITS по умолчанию передает файлы в фоновом режиме, использующем для передачи информации только ситуации низкого сетевого трафика. Для реализации этой функции служба проверяет состояние сети и использует ее в моменты наименьшей загрузки. Также существенным отличием BITS от других механизмов передачи является асинхронный алгоритм работы, который позволяет приложению, инициировавшему передачу файлов, прекратить работу в то время, когда информация еще не передана. После генерации задания на передачу файла пользователь может прекратить выполнение приложения, а уже BITS осуществит передачу данных. Если пользователь, инициировавший передачу файла, закроет свою сессию работы на компьютере, процесс передачи будет приостановлен и возобновлен только после следующей регистрации пользователя в системе. Если задание создано системной службой, выполняющейся под определенной учетной записью (например, LocalSystem) и не требующей регистрации пользователя, то оно будет выполняться во время работы службы.

В операционную систему Microsoft Windows XP включена поддержка BITS версии 1.0, которая поддерживает только получение файлов (download), но не их передачу (upload). Версия BITS 1.5, поддержка которой включена в операционную систему Windows Server 2003, поддерживает двунаправленную передачу файлов. Также версия 1.5 может быть дополнительно установлена для Windows 2000 и Windows XP. В этой статье будет рассматриваться версия BITS 1.5.

Для осуществления передачи файлов должен быть установлен сервер Internet Information Services (IIS) версии 5.0 или 6.0 с серверными расширениями BITS. Версия IIS 5.1, входящая в поставку Windows XP, не поддерживается. Соответствующие обновления можно получить на сайте Microsoft.

Программный интерфейс ориентирован на использование в программах, разрабатываемых на языке C++, и входящие в него заголовочные и библиотечные файлы, а также справочные материалы входят в поставку SDK.

Служба BITS поддерживает протоколы HTTP и HTTPS для получения и загрузки файлов и требует сервера HTTP версии 1.1. Для получения файлов HTTP серверный метод Head должен возвращать размер файла в байтах, а метод Get должен поддерживать заголовки Content-Range и Content-Length. Для передачи динамической информации приложения ASP, ISAPI или CGI также должны поддерживать заголовки Content-Range и Content-Length. В противном случае возможна передача только статической информации. В табл. 1 приведено сравнение BITS и других механизмов, используемых для передачи файлов.

Конечно же, служба BITS может осуществлять и простую передачу файлов между каталогами. На листинге 1 приведен пример функции, которая выполняет простое копирование файлов. Приложение контролирует весь процесс передачи данных, т. е. не является асинхронным.

Перед тем как вкратце описать принципы действия программы, определим терминологию, используемую в API службы BITS. Основной термин, который применяется при описании работы BITS, — «задание» (Job). Это логический контейнер, объединяющий один или несколько файлов, предназначенных для передачи. Все файлы, входящие в задание, имеют одинаковый приоритет. Все задания объединяются в одну очередь заданий (Queue). Задания, помещенные в очередь, выполняются последовательно, т. е. одновременно не может передаваться более одного файла. Если выполнение задания по той или иной причине приостановлено, выполняется следующее задание с наиболее высоким приоритетом. Под файлом (File) понимается объект, имеющий два основных параметра — удаленное (Remote) и локальное (Local) имена. В зависимости от типа задания файл будет либо передан на удаленный ресурс, либо скопирован оттуда.

Программные интерфейсы BITS

Для разработки клиентских приложений специалисты Microsoft создали API, представляющий собой несколько COM-интерфейсов. Это делает API независимым от применяемых средств разработки. В том числе возможно использование функций, представляемых службой BITS в сценариях. Интерфейсы API, необходимые для передачи файлов и обеспечения управления процессом их копирования, приведены в табл. 2.

Рассмотрим пример из листинга 1. В первую очередь создается экземпляр интерфейса IBackgroundCopyManager. Он обеспечит доступ ко всем прочим необходимым интерфейсам. Далее используется метод IBackground CopyManager::CreateJob для создания задания и метод AddFile интерфейса IBackgroundCopyJob для инициализации процесса передачи файла. При создании задания указывается, каким образом оно будет применяться. Возможны три варианта значения параметра Type, имеющего тип BG_JOB_TYPE:

BG_JOB_TYPE_DOWNLOAD — определяет, что задание будет использовано для получения данных на стороне клиентского приложения.

BG_JOB_TYPE_UPLOAD — определяет, что задание будет использовано для передачи (загрузки) данных на сервер. Это значение доступно в версии BITS 1.5.

BG_JOB_TYPE_UPLOAD_REPLY — определяет, что задание будет использовано для передачи (загрузки) данных на сервер и получения файла ответа от серверного приложения. Это значение также доступно в версии BITS 1.5.

Также замечу, что выполнение задания после создания приостанавливается. Для продолжения и наблюдения за ходом выполнения задания используется периодический опрос его состояния. Текущий статус задания возвращает метод GetState интерфейса IBackgroundCopyJob. Статус может принимать следующие значения:

BG_JOB_STATE_QUEUED — показывает, что задание находится в очереди и ожидает выполнения. Если пользователь выйдет из системы до завершения задания, оно будет переведено в это состояние.

BG_JOB_STATE_CONNECTING — показывает, что служба BITS пытается установить соединение с сервером. Если соединение успешно установлено, состояние задания переходит в состояние BG_JOB_STATE_TRANSFERRING, в противном случае будет возвращено значение BG_JOB_STATE_TRANSIENT_ERROR.

BG_JOB_STATE_TRANSFERRING — показывает, что BITS передает информацию, помещенную в задание.

BG_JOB_STATE_SUSPENDED — показывает, что выполнение задания приостановлено. Для перевода в это состояние вызывается метод IBackgroundCopyJob::Suspend. Как я уже отметил выше, служба BITS автоматически приостанавливает задание после его создания. Задание будет находиться в приостановленном состоянии, пока не будет вызван один из методов: IBackgroundCopyJob::Resume, IBackgroundCopyJob::Complete или IBackgroundCopyJob::Cancel.

BG_JOB_STATE_ERROR — показывает, что при выполнении задания возникла критическая ошибка, приводящая к невозможности передачи файла. Когда ошибка будет исправлена, например изменены настройки системы, приводящие к запрещению доступа, вызов метода IBackgroundCopyJob::Resume продолжит выполнение задания. Если ошибка не может быть исправлена, вызов метода IBackgroundCopyJob:

:Cancel прервет выполнение задания, а вызов метода IBackground CopyJob::Complete позволит продолжить передачу других файлов, входящих в задание, и посчитать эту часть успешно завершенной.

BG_JOB_STATE_TRANSIENT_ERROR — показывает, что возникла некритическая ошибка. Служба BITS будет пытаться продолжить передачу данных в течение времени, установленного при вызове метода IBackgroundCopyJob::SetNoProgressTimeout. Если в течение этого времени передача не продолжится, статус задания поменяется на BG_JOB_STATE_ERROR.

BG_JOB_STATE_TRANSFERRED — показывает, что задание успешно завершено. Для заданий, предполагающих получение файлов клиентом, после перехода в это состояние необходимо вызвать метод IBackgroundCopyJob::Complete для предоставления клиентам доступа к полученным файлам.

BG_JOB_STATE_ACKNOWLEDGED — показывает, что клиентским приложением был вызван метод IBackgroundCopyJob::Complete, подтверждающий, что задание успешно выполнено.

BG_JOB_STATE_CANCELLED — показывает, что выполнение задания было прервано клиентским приложением с помощью вызова метода IBackgroundCopyJob::Cancel, который прерывает выполнение задания и удаляет его из очереди.

На рис. 1 показан жизненный цикл задания. Он начинается с генерации задания, это функция клиентского приложения. Задание представляет собой логический контейнер, содержащий файлы для передачи. После создания задания к нему добавляется один или несколько файлов для передачи. Важно! Обращаю внимание читателей на то, что в задание, предназначенное для передачи файлов на сервер, может быть помещен лишь один файл.

087 1
Рисунок 1. Жизненный цикл задания

Служба BITS автоматически приостанавливает задание после его создания. После активизации задания начинается передача информации. Задание выполняется успешно в случае передачи файлов, но может быть и прервано клиентским приложением.

Приведенной информации вполне достаточно для написания простых приложений, использующих службу BITS для передачи и получения файлов.

Но, безусловно, больший интерес представляет возможность осуществлять обмен информацией с HTTP-сервером. Рассмотрим, как происходит такой обмен, каким образом настраивается сервер для реализации этих возможностей, как реализуются серверные и клиентские приложения.

Для использования возможности загрузки файлов на сервер необходимо создать на сервере виртуальную папку, в которую клиенты будут передавать информацию. Виртуальные каталоги создаются для каждого типа обслуживаемых сервером клиентов. Например, для мобильных клиентов, использующих медленные каналы передачи данных, может потребоваться большее время ожидания, чем для клиентов из локальной сети, или может понадобиться ограничение размера данных, которые пользователи смогут размещать на сервере.

Компоненты службы BITS добавляют свойства в базу метаданных IIS. Для создаваемых виртуальных папок эти свойства используются для определения порядка размещения файлов.

Чтобы использовать службу BITS для передачи данных на сервер, необходимо настроить серверные расширения BITS для IIS и разрешить запись в каталоги. Для этого можно воспользоваться предоставляемыми BITS программными API или произвести настройки вручную, открыв окно настройки свойств виртуального каталога в консоли управления IIS.

В табл. 3 приведены параметры, используемые службой Background Intelligent Transfer Service для расширения возможностей IIS по поддержке функций загрузки файлов. В таблице описаны параметры, добавляемые BITS в базу метаданных IIS, относящиеся к виртуальному каталогу. Служба BITS использует эти параметры для определения правил загрузки файлов. Отметим, что под серверным приложением подразумевается приложение CGI, ASP или ISAPI, которое используется при обмене.

Пример, приведенный в листинге 2, включен в SDK и показывает, как установить свойства расширений IIS, используя Windows Scripting Host. Если виртуальный каталог является ссылкой на удаленный ресурс, то кроме приведенных еще устанавливаются значения свойств UNCUserName и UNCPassword.

Взаимодействие с серверными приложениями

Служба BITS использует приведенные в табл. 4 заголовки запросов HTTP для передачи информации серверным приложениям. BITS с помощью параметра BITSServerNotificationType определяет заголовок (header), который будет использоваться. Если параметр BITSServerNotificationType имеет значение 1, BITS передает местоположение загружаемого файла в заголовке. Если параметр BITSServerNotificationType имеет значение 2, BITS передает тело файла в заголовке запроса.

Передача загружаемого файла в теле запроса позволяет существующим приложениям работать с минимальной модификацией кода. Загружаемый и получаемый файлы передаются соответственно в теле запроса и ответа. В следующем примере показано, как служба BITS передает загружаемый файл на серверное приложение в теле запроса.

и далее следуют 80 000 байт передаваемого файла

А так выглядит ответ серверного приложения:

HTTP/1.1 200 — OK
Content-Length: 100

и далее идут 100 байт возвращаемой информации.

Служба BITS передает расположение загружаемого файла и файла ответа в параметрах. Серверное приложение открывает загружаемый файл, обрабатывает данные и создает файл ответа. Затем BITS удаляет загружаемый файл и файл ответа после получения ответа от серверного приложения. Если серверному приложению требуются эти файлы в дальнейшем, они должны быть скопированы в другое место. В следующем примере запроса показано, как BITS передает адрес загружаемого файла серверному приложению:

POST http://myserver/myvdir/handle_upload.asp?ACCOUNT=873112 HTTP/1.1
Host: myserver
BITS-Original-Request-URL: http://front-end-server/vdir
BITS-Request-DataFile-Name: c:physical-pathBITS-Sessions <5e53c221-f2d6-4bf2-
b994-1dc43ceaca8d> equest
BITS-Response-DataFile-Name: c:physical-pathBITS-Sessions <5e53c221-f2d6-4bf2-
b994-1dc43ceaca8d> esponse
Content-Length: 0

А это текст ответа серверного приложения службе BITS; возвращаемая информация находится в файле, определенном параметром BITS-Response-DataFile-Name запроса.

HTTP/1.1 200 — OK
Content-Length: 0

Заметим, что BITS не может осуществить запись файлов в виртуальную папку, для которой разрешены запуск сценариев и программ. Если попытаться записать файлы в такую папку, будет возвращена ошибка. BITS не требует разрешения на запись в виртуальный каталог; более того, рекомендуется вводить запрет на запись.

Настройки, устанавливаемые по умолчанию, позволяют осуществлять запись файлов на сервер. Для записи файлов на сервер и отправки последующего уведомления о завершении процесса необходимо разрешить BITS уведомлять о событиях и указать URL серверного приложения, которое должно быть вызвано. Как правило, это расширение ISAPI. Служба BITS осуществит передачу данных и оповестит сервер. Для этого она использует запросы и ответы, предусмотренные протоколом HTTP для связи с серверным приложением.

Обмен информацией

Выше рассматривалось простое приложение, позволяющее передать файлы. Теперь можно рассмотреть другие интерфейсы, предоставляемые службой BITS. Размещение файла в очереди заданий происходит одним способом, и он уже был рассмотрен. Но получение информации о ходе передачи может осуществляться не только с помощью опроса состояния задания, как было показано в листинге 2.

Реализация интерфейса IBackgroundCopyCallback позволяет получать уведомления о завершении задания, возникших ошибках или изменении его статуса. Клиентское приложение может использовать это решение вместо опроса состояния очереди. Я написал класс, описание которого можно найти в листинге 3, реализующий необходимый интерфейс. Для получения уведомлений нужно передать указатель на объект этого класса с помощью метода IBackgroundCopyJob::SetNotifyInterface. Служба BITS будет использовать этот указатель в течение всего срока жизни приложения. Когда приложение будет запущено вновь, указатель необходимо восстановить. Гарантирован как минимум один вызов после повторной регистрации. Например, если приложение было завершено до завершения задания, то после его повторного старта, даже если он имел место после выполнения задания, произойдет уведомление о завершении. Необходимо реализовать все методы интерфейса IBackground

CopyCallback. Если метод ничего не делает, он должен возвращать значение S_OK. Чтобы определить, оповещения о каких событиях необходимо доставлять в приложение, используется метод IBackgroundCopyJob:

:SetNotifyFlags, которому передается один параметр, состоящий из одного или нескольких флагов:

BG_NOTIFY_JOB_TRANSFERRED — флаг показывает, что оповещение должно быть передано, когда все файлы в задании успешно переданы.

BG_NOTIFY_JOB_ERROR — оповещение об ошибках.

BG_NOTIFY_DISABLE — это значение запрещает службе BITS передавать уведомления о событиях. Все остальные флаги будут проигнорированы.

BG_NOTIFY_JOB_MODIFICATION — состояние задания изменилось. Например, изменился приоритет задания, статус задания или произошло изменение объема переданной информации. Этот флаг игнорируется, если оповещения передаются внешнему приложению (см. ниже).

В листинге 4 показана простая реализация методов класса, принимающего оповещения о событиях.

На рис. 2 показана диаграмма состояний задания. Заметим, что на диаграмме не отражено состояние CANCELED. Так как в него задание может перейти из любого другого состояния, кроме ACKNOWLEDGED, для наглядности я не стал его изображать.

087 2
Рисунок 2. Диаграмма состояний задания

В состояние SUSPENDED задание переходит либо сразу после создания, либо после вызова метода IBackgroundCopyJob::Suspend. В это состояние задание может перейти из любого другого, кроме состояний CANCELED или ACKNOLEDGED.

Если задание переходит в состояние ERROR, то оно может быть перезапущено после устранения ошибки. И наконец, если задание находится в состоянии TRANSIENT ERROR, служба BITS пытается восстановить задание автоматически.

Кроме описанных способов уведомления о событиях, BITS предоставляет еще одну интересную возможность. Можно определить приложение (исполняемый файл), которое будет вызвано при наступлении того или иного события. Для этого используется интерфейс IBackground CopyJob2, указатель на который возвращается вызовом метода IBackgroundCopyJob::ueryInterface (см. листинг 5).

Далее вызовом метода IBackground

CopyJob2::SetNotifyCmdLine указывается приложение, которое должно быть вызвано, и передаваемые ему параметры командной строки. Заметим, что первым параметром должен быть путь к приложению. Вообще говоря, достаточно использовать еще один параметр — идентификатор задания, получаемый при его создании. В отличие от механизма уведомления о событиях, здесь возможно уведомление лишь об ошибках, возникших в процессе выполнения задания, и о завершении задания. Так же как и в предыдущем случае, типы событий, о которых необходимы уведомления, устанавливаются вызовом метода IBackgroundCopyJob:

:SetNotifyFlags. В том случае если ранее был установлен указатель на интерфейс приема информации о событиях, будет возвращена ошибка.

Приложение, которое будет вызвано в случае наступления указанных событий, может восстановить указатель на IBackgroundCopyJob вызовом метода IBackgroundCopyManager:

:GetJob (напомню, что второй параметр командной строки содержит GUID, идентифицирующий задание), примерно так:

hr = CLSIDFromString( argv[1],&JobId );
if( SUCCEEDED(hr) )
<
hr = pManager->GetJob( JobId,&pJob );
.
>

и далее использовать методы этого интерфейса в соответствии с логикой программы.

Интерфейс управления

Для управления свойствами виртуального каталога, отвечающими за взаимодействие с BITS, используется интерфейс IBITSExtensionSetup, который, в частности, позволяет разрешить или запретить запись файлов BITS в виртуальный каталог. Этот интерфейс представляет собой расширение интерфейсов Active Directory, ADSI. Получить указатель на данный интерфейс можно вызовом функции ADsGetObject:

HRESULT hr = IBITSExtensionSetup* pExtensionSetup = NULL;
hr = ADsGetObject( pszPath,__uuidof(IBITSExtensionSetup),&pExtensionSetup );
if( SUCCEEDED(hr) )
<
.
>

Но если этот интерфейс используется из программы, которая также запускает сервер BITS, например из программы установки, необходимо использование метода IBITSExtension

SetupFactory::GetObject для получения указателя на этот интерфейс. В остальных случаях возможно применение любого метода.

Интерфейс предоставляет следующие методы.

EnableBITSUploads — разрешает службе BITS загружать файлы в виртуальный каталог.

DisableBITSUploads — запрещает службе BITS загружать файлы в виртуальный каталог.

GetCleanupTaskName — возвращает имя задания, выполняющего очистку виртуального каталога.

GetCleanupTask — возвращает интерфейс задания, выполняющего очистку виртуального каталога. Это задание удаляет обработанные файлы. Когда создается виртуальный каталог и разрешается запись в него файлов, служба BITS добавляет задание, которое очищает каталог один раз в 12 часов и удаляет задания на передачу файлов, которые в течение этого времени не изменялись. Для определения периода ожидания, в течение которого файлы не будут удалены, необходимо установить свойство BITSSessionTimeout расширений IIS.

В листинге 6 приведен пример функции, разрешающей или запрещающей запись файлов в виртуальный каталог.

Читатели могут спросить, зачем использовать новый сложный API для решения, казалось бы, простых и давно известных задач? Дело в том, что служба BITS позволяет решать совсем не тривиальные задачи. Точнее, ее версия 1.5. Если внимательно просмотреть разделы, описывающие обмен информацией с серверными приложениями, станет понятно, что BITS ориентирована на асинхронный обмен динамическим контентом в среде IIS. Такая возможность, безусловно, стоит изучения нескольких интерфейсов. Кроме того, прямое назначение службы — обмен файлами — может помочь решить огромное количество проблем, возникающих, например, при интеграции распределенных приложений или при передаче больших объемов данных.

Зачем нужна BITS

Использование службы BITS предоставляет следующие преимущества, которые существенно изменяют процесс обмена файлами.

Александр Эпштейн (alex_ep@hotmail.com) — независимый консультант и разработчик программного обеспечения

Поделитесь материалом с коллегами и друзьями

Источник

From Wikipedia, the free encyclopedia

Background Intelligent Transfer Service (BITS)

Developer(s) Microsoft
Initial release October 2001; 21 years ago
Stable release

10.3
/ December 7, 2019; 3 years ago

Operating system Microsoft Windows
Type Download manager
License Proprietary commercial software
Website docs.microsoft.com/en-us/windows/win32/bits/background-intelligent-transfer-service-portal

Background Intelligent Transfer Service (BITS) is a component of Microsoft Windows XP and later iterations of the operating systems, which facilitates asynchronous, prioritized, and throttled transfer of files between machines using idle network bandwidth. It is most commonly used by recent versions of Windows Update, Microsoft Update, Windows Server Update Services, and System Center Configuration Manager to deliver software updates to clients, Microsoft’s anti-virus scanner Microsoft Security Essentials (a later version of Windows Defender) to fetch signature updates, and is also used by Microsoft’s instant messaging products to transfer files. BITS is exposed through the Component Object Model (COM).

Technology[edit]

BITS uses idle bandwidth to transfer data. Normally, BITS transfers data in the background, i.e., BITS will only transfer data whenever there is bandwidth which is not being used by other applications. BITS also supports resuming transfers in case of disruptions.

BITS version 1.0 supports only downloads. From version 1.5, BITS supports both downloads and uploads. Uploads require the IIS web server, with BITS server extension, on the receiving side.

Transfers[edit]

BITS transfers files on behalf of requesting applications asynchronously, i.e., once an application requests the BITS service for a transfer, it will be free to do any other task, or even terminate. The transfer will continue in the background as long as the network connection is there and the job owner is logged in. BITS jobs do not transfer when the job owner is not signed in.

BITS suspends any ongoing transfer when the network connection is lost or the operating system is shut down. It resumes the transfer from where it left off when (the computer is turned on later and) the network connection is restored. BITS supports transfers over SMB, HTTP and HTTPS.

Bandwidth[edit]

BITS attempts to use only spare bandwidth. For example, when applications use 80% of the available bandwidth, BITS will use only the remaining 20%. BITS constantly monitors network traffic for any increase or decrease in network traffic and throttles its own transfers to ensure that other foreground applications (such as a web browser) get the bandwidth they need.
Note that BITS does not necessarily measure the actual bandwidth. BITS versions 3.0 and up will use Internet Gateway Device counters, if available, to more accurately calculate available bandwidth. Otherwise, BITS will use the speed as reported by the NIC to calculate bandwidth. This can lead to bandwidth calculation errors, for example when a fast network adapter (10 Mbit/s) is connected to the network via a slow link (56 kbit/s).[1]

Jobs[edit]

BITS uses a queue to manage file transfers. A BITS session has to be started from an application by creating a Job. A job is a container, which has one or more files to transfer. A newly created job is empty. Files must be added, specifying both the source and destination URIs. While a download job can have any number of files, upload jobs can have only one. Properties can be set for individual files. Jobs inherit the security context of the application that creates them.
BITS provides API access to control jobs. A job can be programmatically started, stopped, paused, resumed, and queried for status. Before starting a job, a priority has to be set for it to specify when the job is processed relative to other jobs in the transfer queue. By default, all jobs are of Normal priority. Jobs can optionally be set to High, Low, or Foreground priority. Background transfers are optimized by BITS,1 which increases and decreases (or throttles) the rate of transfer based on the amount of idle network bandwidth that is available. If a network application begins to consume more bandwidth, BITS decreases its transfer rate to preserve the user’s interactive experience, except for Foreground priority downloads.

Scheduling[edit]

BITS schedules each job to receive only a finite time slice, for which only that job is allowed to transfer, before it is temporarily paused to give another job a chance to transfer. Higher priority jobs get a higher chunk of time slice. BITS uses round-robin scheduling to process jobs in the same priority and to prevent a large transfer job from blocking smaller jobs.

When a job is newly created, it is automatically suspended (or paused). It has to be explicitly resumed to be activated. Resuming moves the job to the queued state. On its turn to transfer data, it first connects to the remote server and then starts transferring. After the job’s time slice expires, the transfer is temporarily paused, and the job is moved back to the queued state. When the job gets another time slice, it has to connect again before it can transfer. When the job is complete, BITS transfers ownership of the job to the application that created it.

BITS includes a built-in mechanism for error handling and recovery attempts. Errors can be either fatal or transient; either moves a job to the respective state. A transient error is a temporary error that resolves itself after some time. For a transient error, BITS waits for some time and then retries. For fatal errors, BITS transfers control of the job to the creating application, with as much information regarding the error as it can provide.

Command-line interface tools[edit]

BITSAdmin command[edit]

BITSAdmin

Developer(s) Microsoft
Stable release

3.0

Operating system Microsoft Windows
Type Command
License Proprietary commercial software
Website docs.microsoft.com/en-us/windows-server/administration/windows-commands/bitsadmin

Microsoft provides a BITS Administration Utility (BITSAdmin) command-line utility to manage BITS jobs. The utility is part of Windows Vista and later.[2][3] It is also available as a part of the Windows XP Service Pack 2 Support Tools[4] or Windows Server 2003 Service Pack 1 Support Tools.[5]

Usage example:

C:>bitsadmin /transfer myDownloadJob /download /priority normal https://example.com/file.zip C:file.zip

PowerShell BitsTransfer[edit]

In Windows 7, the BITSAdmin utility is deprecated in favor of Windows PowerShell cmdlets.[6] The BitsTransfer PowerShell module provides eight cmdlets with which to manage BITS jobs.[7]

The following example is the equivalent of the BITSAdmin example above:

PS C:> Start-BitsTransfer -Source "https://example.com/file.zip" -Destination "C:file.zip" -DisplayName "myDownloadJob"

List of non-Microsoft applications that use BITS[edit]

  • AppSense – Uses BITS to install Packages on clients.
  • BITS Download Manager – A download manager for Windows that creates BITS Jobs.[8]
  • BITSync – An open source utility that uses BITS to perform file synchronization on Server Message Block network shares.[9]
  • Civilization V – Uses BITS to download mod packages.
  • Endless OS installer for Windows – Uses BITS to download OS images.[10]
  • Eve Online – Uses BITS to download all the patches post-Apocrypha (March 10, 2009). It is also now used in the client repair tool.
  • Some Google services including Chrome, Gears, Pack, Flutter updater and YouTube Uploader used BITS.[citation needed]
  • Firefox (since version 68) for updates.[11]
  • KBOX Systems Management Appliance – A systems management appliance that can use BITS to deliver files to Windows systems.
  • RSS Bandit – Uses BITS to download attachments in web feeds.
  • Oxygen media platform – Uses BITS to distribute Media Content and Software Updates.[12]
  • SharpBITS – An open source download manager for Windows that handles BITS jobs.[13]
  • WinBITS – An open source Downloader for Windows that downloads files by creating BITS Jobs.[14]
  • Novell ZENworks Desktop Management – A systems management software that can use BITS to deliver application files to workstations.[15]
  • Specops Deploy/App – A systems management software that (when available) uses BITS for delivering packages to the clients in the background.[16]

See also[edit]

  • List of Microsoft Windows components
  • Protocols for file transfer

References[edit]

  1. ^ «MSDN BITS Network Bandwidth». Archived from the original on 2017-04-19. Retrieved 2015-05-01.
  2. ^ Satran, Michael; Smith, Peter (5 March 2019). «BITSAdmin tool». Windows Dev Center. Microsoft. Archived from the original on 18 April 2020. Retrieved 28 April 2020.
  3. ^ Ross, Elizabeth; White, Steven; Poggemeyer, Liza; Lee, Thomas; Plett, Corey (16 October 2017). «bitsadmin». Windows IT Pro Center. Microsoft. Archived from the original on 30 April 2019. Retrieved 9 June 2019.
  4. ^ «Windows XP Service Pack 2 Support Tools». Download Center. Microsoft. 10 August 2004. Archived from the original on 29 April 2020. Retrieved 28 April 2020.
  5. ^ «Windows Server 2003 Service Pack 1 32-bit Support Tools». Download Center. Microsoft. 30 March 2005. Archived from the original on 21 July 2020. Retrieved 28 April 2020.
  6. ^ «Manage BITS (Background Intelligent Transfer Service) with Windows PowerShell». TechNet Magazine. Microsoft. Archived from the original on 22 August 2020. Retrieved 25 September 2015.
  7. ^ «BitsTransfer». Windows IT Pro Center. Microsoft. Archived from the original on 11 November 2020. Retrieved 28 April 2020.
  8. ^ «BITS Download Manager». Archived from the original on 2020-08-15. Retrieved 2010-01-07.
  9. ^ «BITSync». Archived from the original on 2009-01-24. Retrieved 2008-12-31.
  10. ^ Endless Installer for Windows DownloadManager class
  11. ^ «Firefox 68.0, See All New Features, Updates and Fixes». Mozilla. Archived from the original on 2019-07-11. Retrieved 2019-07-09.
  12. ^ Oxygen media platform
  13. ^ «SharpBITS». Archived from the original on 2018-01-22. Retrieved 2021-03-31.
  14. ^ «WinBITS». Archived from the original on 2019-05-18. Retrieved 2007-11-19.
  15. ^ «Zenworks 7». Archived from the original on 2009-02-12. Retrieved 2021-03-31.
  16. ^ «Specops Deploy/App». Archived from the original on 2020-12-20. Retrieved 2021-03-31.

External links[edit]

  • Background Intelligent Transfer Service in Windows Server 2008
  • Fix Background Intelligent Transfer Service in Windows 10
  • BITS version history
  • bitsadmin | Microsoft Docs

The following has been copied/pasted from the following msdn webpage. If you have questions around BITS configuration and usage then book mark this page for future reference.

https://msdn.microsoft.com/en-us/library/windows/desktop/aa362823(v=vs.85).aspx

BITS Return Values

The Bitsmsg.h file contains the following return value constants. The constants represent return values that BITS generates and HTTP return values that BITS captures. All other return values that you can receive are COM, RPC, or converted Windows return values (BITS uses theHRESULT_FROM_WIN32 macro to convert the Windows return values to HRESULT values).

Note that the Bitsmsg.h file contains additional return values not listed below.

BG_S_PARTIAL_COMPLETE (0x00200017)

A subset of the job’s files transferred successfully before the IBackgroundCopyJob::Complete method was called. Those that were not complete were deleted.

BG_S_UNABLE_TO_DELETE_FILES (0x0020001A)

Unable to delete all temporary files associated with the job.

BG_S_OVERRIDDEN_BY_POLICY (0x00200055)

The configuration preference has been saved successfully, but the preference will not be used because a configured Group Policy setting overrides the preference.

BG_E_NOT_FOUND (0x80200001)

The requested job was not found.

BG_E_INVALID_STATE (0x80200002)

The requested action is not allowed in the current job state.

BG_E_EMPTY (0x80200003)

The job must contain one or more files before you can resume the job.

BG_E_FILE_NOT_AVAILABLE (0x80200004)

File information is not available because the error is not associated with a local or remote file.

BG_E_PROTOCOL_NOT_AVAILABLE (0x80200005)

Protocol information is not available because the error is not associated with the specified transfer protocol.

BG_E_DESTINATION_LOCKED (0x8020000D)

The destination file system volume, specified in the local file name, is locked.

BG_E_VOLUME_CHANGED (0x8020000E)

The destination volume, specified in the local file name, has changed. For example, the original floppy disk has been replaced with a different floppy disk.

BG_E_ERROR_INFORMATION_UNAVAILABLE (0x8020000F)

Error information is only available when the state of the job is BG_JOB_STATE_ERROR. The error information is not available after BITS begins transferring the job’s data or the client exits.

BG_E_NETWORK_DISCONNECTED (0x80200010)

The network adapter is inactive or disconnected. All jobs are placed in the BG_JOB_STATE_TRANSIENT_ERROR state.

BG_E_MISSING_FILE_SIZE (0x80200011)

The server did not return the file size. BITS only transfers static content and requires the HTTP server to return the Content-Length header. The transfer request fails if the URL points to dynamic content.

BG_E_INSUFFICIENT_HTTP_SUPPORT (0x80200012)

The server does not support the HTTP/1.1 protocol.

BG_E_INSUFFICIENT_RANGE_SUPPORT (0x80200013)

The server does not support the Content-Range header. Typically, you receive this error when you try to download dynamic content. You can also receive this error if an intermediate proxy is removing the Content-Range or Content-Length header.

BG_E_REMOTE_NOT_SUPPORTED (0x80200014)

Remote use of BITS is not supported. For more information, see Users and Network Connections.

BG_E_NEW_OWNER_DIFF_MAPPING (0x80200015)

The network drive mapping for the local file is different for the current owner than for the previous owner.

BG_E_NEW_OWNER_NO_FILE_ACCESS (0x80200016)

The new owner has insufficient permissions to the temporary job files.

BG_E_PROXY_LIST_TOO_LARGE (0x80200018)

The HTTP proxy list is too long. The list must not exceed 32 KB.

BG_E_PROXY_BYPASS_LIST_TOO_LARGE (0x80200019)

The HTTP proxy bypass list is too long. The list must not exceed 32 KB.

BG_E_TOO_MANY_FILES (0x8020001C)

You cannot add more than one file to an upload job.

BG_E_LOCAL_FILE_CHANGED (0x8020001D)

The contents of the local file changed after the transfer process began. The contents of the local file cannot change after the transfer process begins on an upload or upload-reply job.

BG_E_TOO_LARGE (0x80200020)

The size of the upload file exceeds the maximum allowed upload size specified on the server.

BG_E_STRING_TOO_LONG (0x80200021)

The specified string is too long.

BG_E_CLIENT_SERVER_PROTOCOL_MISMATCH (0x80200022)

The client and server were unable to negotiate a protocol to use for the upload job.

BG_E_SERVER_EXECUTE_ENABLED (0x80200023)

Scripting or execute permissions are enabled on the IIS virtual directory associated with the job. To upload files to the virtual directory, disable the scripting and execute permissions on the virtual directory.

BG_E_USERNAME_TOO_LARGE (0x80200025)

The user name cannot exceed 300 characters.

BG_E_PASSWORD_TOO_LARGE (0x80200026)

The password cannot exceed 65535 characters.

BG_E_INVALID_AUTH_TARGET (0x80200027)

The specified authentication target is not valid.

BG_E_INVALID_AUTH_SCHEME (0x80200028)

The specified authentication scheme is not valid.

BG_E_INVALID_RANGE (0x8020002B)

The specified byte range is invalid. The byte range must exist within the specified remote file.

BG_E_OVERLAPPING_RANGES (0x8020002C)

The list of byte ranges contains overlapping or duplicate ranges, which are not supported.

BG_E_BLOCKED_BY_POLICY (0x8020003E)

Group Policy settings prevent background jobs from running at this time. For details, see the MaxInternetBandwidth policy.

BG_E_INVALID_PROXY_INFO (0x8020003F)

Run-time error that indicates the proxy list or proxy bypass list that you specified using the IBackgroundCopyJob::SetProxySettingsmethod is invalid.

BG_E_INVALID_CREDENTIALS (0x80200040)

The format of the supplied security credentials is not valid.

BG_E_RECORD_DELETED (0x80200042)

The cache record has been deleted. The attempt to update it has been abandoned.

BG_E_UPNP_ERROR (0x80200045)

A Universal Plug and Play (UPnP) error has occurred. Please check your Internet Gateway Device.

BG_E_PEERCACHING_DISABLED (0x80200047)

Peer-caching is disabled.

BG_E_BUSYCACHERECORD (0x80200048)

The cache record is in use and cannot be changed or deleted. Try again after a few seconds.

BG_E_TOO_MANY_JOBS_PER_USER (0x80200049)

The job count for the user has exceeded the per user job limit set by the MaxJobsPerUser Group Policy setting.

BG_E_TOO_MANY_JOBS_PER_MACHINE (0x80200050)

The job count for the computer has exceeded the per computer job limit set by the MaxJobsPerMachine Group Policy setting.

BG_E_TOO_MANY_FILES_IN_JOB (0x80200051)

The file count for the job has exceeded the per job file limit set by the MaxFilesPerJob Group Policy setting.

BG_E_TOO_MANY_RANGES_IN_FILE (0x80200052)

The range count for the file has exceeded the per file range limit set by the MaxRangesPerFile Group Policy setting.

BG_E_VALIDATION_FAILED (0x80200053)

The application requested data from a website, but the response was not valid. For details, use Event Viewer to view the Application LogsMicrosoftWindowsBits-clientOperational log.

BG_E_MAXDOWNLOAD_TIMEOUT (0x80200054)

BITS timed out downloading the job. The download did not complete within the maximum download time set on the job or the MaxDownloadTime Group Policy setting.

BG_E_HTTP_ERROR_400 (0x80190190)

The server could not process the transfer request because the syntax of the remote file name is invalid.

BG_E_HTTP_ERROR_401 (0x80190191)

The user does not have permission to access the remote file. The requested resource requires user authentication.

BG_E_HTTP_ERROR_404 (0x80190194)

The requested URL does not exist on the server.

In IIS 7, this error can indicate

  • That BITS uploads are not enabled on the virtual directory (vdir) on the server.
  • That the upload size exceeds the maximum upload limit (for details, see the BITSMaximumUploadSize IIS extension property).

BG_E_HTTP_ERROR_407 (0x80190197)

The user does not have permission to access the proxy. The proxy requires user authentication.

BG_E_HTTP_ERROR_414 (0x8019019E)

The server cannot process the transfer request. The Uniform Resource Identifier (URI) in the remote file name is longer than the server can interpret.

BG_E_HTTP_ERROR_501 (0x801901F5)

The server does not support the functionality required to fulfill the request. In IIS 6, this error indicates that BITS uploads are not enabled on the virtual directory (vdir) on the server.

BG_E_HTTP_ERROR_503 (0x801901F7)

The service is temporarily overloaded and cannot process the request. Resume the job at a later time.

BG_E_HTTP_ERROR_504 (0x801901F8)

The transfer request timed out while waiting for a gateway. Resume the job at a later time.

BG_E_HTTP_ERROR_505 (0x801901F9)

The server does not support the HTTP protocol version specified in the remote file name.

The Bitsmsg.h header file contains additional HTTP return values not listed above that BITS uses internally. For information on these and other HTTP return values you can receive, see the RFC 2616 specification from the Internet Engineering Task Force athttp://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.

I have an app using BITS to download files. When I packaged my app with MSIX, it started behaving strangely. Every background copy job started from the packaged app transitions into the BG_JOB_STATE_TRANSIENT_ERROR state immediately and stays that way until the app is closed or becomes inactive/minimized. This behavior is still unclear.

Using bitsadmin /list /allusers /verbose, I got this:

GUID: {A8C6001C-182D-424B-86DC-6C8E131E185B} DISPLAY: 'Download an update'
TYPE: DOWNLOAD STATE: TRANSIENT_ERROR OWNER: ....
PRIORITY: NORMAL FILES: 0 / 1 BYTES: 0 / UNKNOWN
CREATION TIME: 9/2/2022 11:33:08 AM MODIFICATION TIME: 9/2/2022 11:33:58 AM
COMPLETION TIME: UNKNOWN ACL FLAGS:
NOTIFY INTERFACE: UNREGISTERED NOTIFICATION FLAGS: 3
RETRY DELAY: 600 NO PROGRESS TIMEOUT: 1209600 ERROR COUNT: 0
PROXY USAGE: PRECONFIG PROXY LIST: NULL PROXY BYPASS LIST: NULL
ERROR FILE:    ...
ERROR CODE:    0x8020006e - The background access settings of the job's owner app prevent the job from transferring at this time.
ERROR CONTEXT: 0x00000002 - The error occurred in the Background Intelligent Transfer Service (BITS) queue manager.
DESCRIPTION:
JOB FILES:
        0 / UNKNOWN WORKING ...
NOTIFICATION COMMAND LINE: none
owner MIC integrity level: MEDIUM
owner elevated ?           false

Peercaching flags
         Enable download from peers      :false
         Enable serving to peers         :false

CUSTOM HEADERS: NULL

I tried to set the job’s priority, but it didn’t help. I also had a hunch that I might need to enable some capability in the MSIX manifest, but I haven’t found anything. I also tried to use the BackgroundDownloader from my WPF app, but it looks like UWP only.

Is it a known behavior? Anything I can do to make it transfer bites while the packaged app is running?

My code:

  • it’s based on BITS-Manager
  • it works great if the app is not pacakged
  • I was able to reproduce the same behavior with BITS-Manager as well
internal class DownloadJob : BITS.IBackgroundCopyCallback
{
    private readonly TaskCompletionSource taskCompletionSource;
    private BITS.IBackgroundCopyJob job;

    public DownloadJob()
    {
        this.taskCompletionSource = new TaskCompletionSource();
        this.job = null;
    }

    public Task Start(string name, string url, string path, Action<byte[]> onJobIdCreated)
    {
        try
        {
            var manager = new BITS.BackgroundCopyManager1_5();
            GUID jobGuid;
            manager.CreateJob(
                name,
                BITS.BG_JOB_TYPE.BG_JOB_TYPE_DOWNLOAD,
                out jobGuid,
                out job);

            onJobIdCreated(jobGuid.GetBytes()); 

            job.AddFile(url, path);
            job.SetDownloadCost(Costs.TRANSFER_STANDARD);
            job.DisablePeerCaching();
            this.RegisterListenerFor(job);
            job.Resume();
        }
        catch
        {
            job?.Cancel();
            taskCompletionSource.TrySetException(new DownloadFailedException());
        }

        return taskCompletionSource.Task;
    }

    public void JobTransferred(BITS.IBackgroundCopyJob job)
    {
        job?.Complete();
        taskCompletionSource.TrySetResult();
    }

    public void JobError(BITS.IBackgroundCopyJob job, BITS.IBackgroundCopyError error)
    {
        job?.Cancel();
        taskCompletionSource.TrySetException(new DownloadFailedException());
    }

    public void JobModification(BITS.IBackgroundCopyJob pJob, uint dwReserved)
    {
    }
}

The packaging manifest:

<?xml version="1.0" encoding="utf-8"?>

<Package
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
  xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
  IgnorableNamespaces="uap rescap">

  <Identity
    Name="..."
    Publisher="..."
    Version="1.0.0.0" />

  <Properties>
    <DisplayName>BITSManagerPackaged</DisplayName>
    <PublisherDisplayName>...</PublisherDisplayName>
    <Logo>ImagesStoreLogo.png</Logo>
  </Properties>

  <Dependencies>
    <TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
    <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.14393.0" MaxVersionTested="10.0.14393.0" />
  </Dependencies>

  <Resources>
    <Resource Language="x-generate"/>
  </Resources>

  <Applications>
    <Application Id="App"
      Executable="$targetnametoken$.exe"
      EntryPoint="$targetentrypoint$">
      <uap:VisualElements
        DisplayName="BITSManagerPackaged"
        Description="BITSManagerPackaged"
        BackgroundColor="transparent"
        Square150x150Logo="ImagesSquare150x150Logo.png"
        Square44x44Logo="ImagesSquare44x44Logo.png">
        <uap:DefaultTile Wide310x150Logo="ImagesWide310x150Logo.png" />
        <uap:SplashScreen Image="ImagesSplashScreen.png" />
      </uap:VisualElements>
    </Application>
  </Applications>

  <Capabilities>
    <Capability Name="internetClient" />
    <rescap:Capability Name="runFullTrust" />
  </Capabilities>
</Package>

Понравилась статья? Поделить с друзьями:
  • Bitrixsetup php 500 ошибка
  • Bitrixsetup http error 500
  • Bitrix24 mysql query error
  • Bitrix резервное копирование error processing file
  • Bitrix показывать ошибки display errors