Práticas recomendadas ao usar o BITS

Esta seção contém informações que você deve considerar ao criar um aplicativo que usa o BITS.

Contexto do usuário ou contexto do serviço

O BITS transfere arquivos somente quando o proprietário do trabalho está conectado ao computador (o usuário deve ter feito logon interativamente). O BITS não oferece suporte ao comando RunAs . Para obter mais detalhes, consulte Usuários e conexões de rede.

Se você não precisar do contexto de um usuário para seu aplicativo, considere escrever um serviço em execução como LocalSystem, LocalService ou NetworkService. Essas contas do sistema estão sempre conectadas, portanto, a transferência não está sujeita a um logoff do usuário. No entanto, se você representar um usuário ao criar o trabalho, as regras de logon interativo serão aplicadas. Para obter mais detalhes, consulte Contas de serviço e BITS.

Os trabalhos são persistentes

Os trabalhos permanecem na fila até que você chame o método IBackgroundCopyJob::Complete ou IBackgroundCopyJob::Cancel . Os arquivos no trabalho não estarão disponíveis para o usuário até que você chame Concluído. Normalmente, você chama Concluir quando o estado do trabalho é BG_JOB_STATE_TRANSFERRED e chama Cancelar quando o trabalho está no estado BG_JOB_STATE_TRANSIENT_ERROR ou BG_JOB_STATE_ERROR e não pode mais progredir.

Se você não chamar o método Complete ou o método Cancel dentro de 90 dias (Diretiva de Grupo JobInactivityTimeout padrão), o serviço cancelará o trabalho. Você deve sempre chamar o método Complete ou Cancel e não confiar na política JobInactivityTimeout para limpar seus trabalhos. Os trabalhos deixados na fila podem impedir que os usuários criem outros trabalhos se o limite de política MaxJobsPerUser ou MaxJobsPerMachine for atingido.

Quando usar prioridade de primeiro plano ou plano de fundo

A menos que o trabalho seja crítico em termos de tempo ou o usuário esteja aguardando ativamente, você deve sempre usar uma prioridade em segundo plano. No entanto, há momentos em que você pode querer alternar da prioridade em segundo plano para a prioridade de primeiro plano, por exemplo, quando o proxy ou o servidor não oferece suporte ao cabeçalho Content-Range ou o software antivírus no cliente remove a solicitação de cabeçalho de intervalo. Alternar para prioridade de primeiro plano funciona apenas para os arquivos cujo tamanho de arquivo é inferior a 2 GB. Para obter um exemplo, consulte a implementação do método IBackgroundCopyCallback::JobError. Observe também que, se o trabalho de primeiro plano for interrompido devido a uma desconexão de rede ou ao usuário fazer logoff, o trabalho falhará porque o BITS enviará uma solicitação de intervalo para tentar reiniciar a transferência de onde parou.

A partir do Windows 8, você deve configurar trabalhos de download com BITS_JOB_PROPERTY_DYNAMIC_CONTENT e BG_JOB_PRIORITY_FOREGROUND ao direcionar servidores que não atendem aos Requisitos HTTP para Downloads do BITS. Tenha em mente que isso resultará em BITS tendo que reiniciar o download desde o início se ele for interrompido (por exemplo, devido a problemas de conectividade ou reinicialização do sistema).

Para obter informações sobre as prioridades disponíveis e como o BITS usa o nível de prioridade para agendar trabalhos, consulte BG_JOB_PRIORITY.

Erros transitórios e fatais

Alguns erros são recuperáveis e outros não. Por exemplo, o erro "O servidor não está disponível" é um erro recuperável e o erro "Acesso negado" é um erro fatal. O BITS coloca os erros recuperáveis em um estado de erro transitório e tenta o trabalho novamente após um intervalo especificado. Se o trabalho não conseguir progredir, o BITS moverá o trabalho para um estado de erro fatal. Use os métodos IBackgroundCopyJob::SetMinimumRetryDelay e IBackgroundCopyJob::SetNoProgressTimeout para controlar como o BITS processa erros transitórios.

Para trabalhos em primeiro plano, você deve limitar a quantidade de tempo que você deixa um trabalho permanecer no estado de erro transitório e tentar recuperar. Use o método SetNoProgressTimeout para limitar a quantidade de tempo que um trabalho permanece no estado de erro transitório ou para forçar o trabalho ao estado de erro fatal. Se você permitir que o trabalho tente se recuperar, use o método SetMinimumRetryDelay para definir o atraso mínimo de repetição para 60 segundos ou chame o método IBackgroundCopyJob::Resume para ativar o trabalho novamente.

Para obter mais informações, consulte BG_JOB_STATE, Ciclo de vida de um trabalho do BITS e Manipulando erros.

Medindo o uso da largura de banda da rede

O BITS pode usar o adaptador de rede do cliente para estimar a largura de banda de rede disponível. Como o BITS não é capaz de medir a largura de banda além do cliente, o BITS pode congestionar o link WAN. Para reduzir o congestionamento no link WAN, você pode usar a diretiva de grupo MaxInternetBandwidth para limitar a quantidade de largura de banda que o cliente usa. Para obter mais informações, consulte Largura de banda de rede e diretivas de grupo.

Se você estiver escrevendo um aplicativo que muitos clientes usarão para baixar arquivos de um determinado servidor, você deve considerar um esquema que escalona as solicitações de download para que você não sobrecarregue o servidor com solicitações.

Definindo credenciais para autenticação de proxy e servidor

Se você espera que o proxy ou servidor exija credenciais de usuário, você deve fornecer as credenciais para o BITS. Para especificar as credenciais, chame o método IBackgroundCopyJob2::SetCredentials. O BITS oferece suporte a esquemas de autenticação Basic, Digest, Negotiate, NTLM e Passport.

Para obter detalhes sobre autenticação, consulte Autenticação.

Especificando configurações de proxy para contas de usuário e contas de serviço

Por padrão, o BITS usa as configurações de proxy do Internet Explorer do usuário. Para substituir as configurações de proxy do Internet Explorer do usuário, chame o método IBackgroundCopyJob::SetProxySettings.

As configurações de proxy do Internet Explorer não se aplicam a contas do sistema, portanto, o comportamento de proxy padrão (BG_JOB_PROXY_USAGE_PRECONFIG) só funcionará corretamente em implantações do WPAD (Web Proxy Auto-Discovery Protocol), a menos que etapas de configuração adicionais sejam executadas. Se seu aplicativo for um serviço em execução como LocalSystem, LocalService ou NetworkService, considere configurar um token auxiliar em seus trabalhos do BITS ou definir explicitamente as configurações de proxy corretas chamando IBackgroundCopyJob::SetProxySettings com BG_JOB_PROXY_USAGE_OVERRIDE. Como alternativa, você pode usar as opções /Util /SetIEProxy do BitsAdmin.exe para definir as configurações de proxy do Internet Explorer para a conta do sistema LocalSystem, LocalService ou NetworkService. Para obter detalhes, consulte BitsAdmin Tool.

O BITS não reconhece as configurações de proxy definidas usando o arquivo Proxycfg.exe.

A partir da atualização de outubro de 2018 do Windows 10 (10.0; Build 17763), o BITS usa a mesma ordem de proxy que o WinHttp usa com AUTOMATIC_PROXY. O BITS usa essa ordem mais compatível quando BG_JOB_PROXY_USAGE_PRECONFIG é especificado. BG_JOB_PROXY_USAGE_PRECONFIG é o valor padrão para especificar o proxy HTTP.

Especificando configurações específicas do usuário para autenticar proxies

Se você estiver usando o BITS em um ambiente que exija autenticação de proxy durante a execução como uma conta sem credenciais NTLM ou Kerberos utilizáveis no domínio de rede da máquina, deverá executar etapas extras para autenticar corretamente usando as credenciais de outra conta de usuário que tenha credenciais no domínio. Esse é um cenário típico quando o código BITS está sendo executado como um serviço do sistema, como LocalService, NetworkService ou LocalSystem, pois essas contas não têm credenciais NTLM ou Kerberos utilizáveis.

Para obter detalhes sobre como a autenticação funciona nesse cenário, consulte Autenticação.

Escalabilidade

Se mais de 100 trabalhos estiverem na fila, o desempenho pode começar a diminuir dependendo da composição do trabalho. O BITS usa a configuração de diretiva MaxJobsPerMachine para impor um limite rígido ao número de trabalhos na fila. As candidaturas devem limitar o número de seus empregos a cerca de 10, de modo que vários aplicativos terão menos chance de exceder a diretriz de 100 empregos. Normalmente, um aplicativo com um grande número de trabalhos a serem enviados primeiro enviaria 10 trabalhos e, em seguida, enviaria um de cada vez à medida que cada trabalho terminasse.

O número de arquivos no trabalho também deve ser limitado a um máximo de 10 arquivos. Se você quiser transferir um grande número de arquivos para um trabalho, considere a criação de um arquivo CAB que contenha todos os arquivos.

Cabeçalhos HTTP podem ser em qualquer caso

Os padrões HTTP sempre disseram que os cabeçalhos HTTP devem ser tratados como diferenciando maiúsculas de minúsculas (RFC 7230 seção 3.2). O padrão HTTP mais recente, RFC 7540, vai além e diz que o tráfego HTTP/2 deve comparar os cabeçalhos como não diferenciando maiúsculas de minúsculas e deve apresentar cabeçalhos em letras minúsculas (RFC 6540, seção 8.1.2). Mesmo quando o tráfego é enviado com cabeçalhos que não são minúsculos, os proxies podem optar por forçar os cabeçalhos a minúsculas.

Evitar informações de identificação pessoal (PII)

Os trabalhos do BITS, incluindo o nome de exibição e a descrição do trabalho e os nomes de arquivo, são visíveis para todos os usuários com privilégios de administrador. Eles também podem ser adicionados à Telemetria do Windows. Você deve evitar colocar dados confidenciais (como o próprio nome do usuário) nos detalhes do trabalho.