Bewährte Methoden bei der Verwendung von BITS

Dieser Abschnitt enthält Informationen, die Sie beim Entwerfen einer Anwendung berücksichtigen sollten, die BITS verwendet.

Benutzerkontext oder Dienstkontext

BITS überträgt Dateien nur, wenn der Besitzer des Auftrags am Computer angemeldet ist (der Benutzer muss interaktiv angemeldet sein). BITS unterstützt den Befehl RunAs nicht. Weitere Informationen finden Sie unter Benutzer und Netzwerkverbindungen.

Wenn Sie den Kontext eines Benutzers für Ihre Anwendung nicht benötigen, sollten Sie stattdessen einen Dienst schreiben, der als LocalSystem, LocalService oder NetworkService ausgeführt wird. Diese Systemkonten sind immer angemeldet, sodass die Übertragung nicht von einem Benutzer abgemeldet wird. Wenn Sie jedoch die Identität eines Benutzers annehmen, wenn Sie den Auftrag erstellen, gelten die interaktiven Anmelderegeln. Weitere Informationen finden Sie unter Dienstkonten und BITS.

Aufträge sind persistent

Aufträge verbleiben in der Warteschlange, bis Sie die IBackgroundCopyJob::Complete - oder IBackgroundCopyJob::Cancel-Methode aufrufen. Die Dateien im Auftrag sind für den Benutzer erst verfügbar, wenn Sie Complete aufrufen. In der Regel rufen Sie Complete auf, wenn der Status des Auftrags BG_JOB_STATE_TRANSFERRED ist, und Sie rufen Abbrechen auf, wenn sich der Auftrag im BG_JOB_STATE_TRANSIENT_ERROR - oder BG_JOB_STATE_ERROR Zustand befindet und keinen Fortschritt mehr machen kann.

Wenn Sie die Complete-Methode oder die Cancel-Methode nicht innerhalb von 90 Tagen aufrufen (Standard jobInactivityTimeout Gruppenrichtlinie), wird der Auftrag vom Dienst abgebrochen. Sie sollten immer die Complete - oder Cancel-Methode aufrufen und sich nicht auf die JobInactivityTimeout-Richtlinie verlassen, um Ihre Aufträge zu bereinigen. Aufträge, die in der Warteschlange verbleiben, können Benutzer daran hindern, andere Aufträge zu erstellen, wenn das MaxJobsPerUser- oder MaxJobsPerMachine-Richtlinienlimit erreicht wird.

Verwendung von Vordergrund- oder Hintergrundpriorität

Es sei denn, der Auftrag ist zeitkritisch oder der Benutzer wartet aktiv, sollten Sie immer eine Hintergrundpriorität verwenden. Es gibt jedoch Situationen, in denen Sie von der Hintergrundpriorität zur Vordergrundpriorität wechseln möchten, z. B. wenn der Proxy oder Server den Content-Range-Header nicht unterstützt oder die Bereichsheaderanforderung durch Antivirensoftware auf dem Client entfernt wird. Der Wechsel zur Vordergrundpriorität funktioniert nur für Dateien, deren Dateigröße kleiner als 2 GB ist. Ein Beispiel finden Sie in der Implementierung für die IBackgroundCopyCallback::JobError-Methode . Beachten Sie außerdem, dass der Auftrag fehlschlägt, wenn der Vordergrundauftrag dann aufgrund einer Netzwerkverbindung unterbrochen wird oder sich der Benutzer abmeldet, weil BITS eine Bereichsanforderung sendet, um zu versuchen, die Übertragung von dort neu zu starten, wo er aufgehört hat.

Ab Windows 8 sollten Sie Downloadaufträge mit BITS_JOB_PROPERTY_DYNAMIC_CONTENT und BG_JOB_PRIORITY_FOREGROUND konfigurieren, wenn Sie Server verwenden, die die HTTP-Anforderungen für BITS-Downloads nicht erfüllen. Beachten Sie, dass dies dazu führt, dass BITS den Download von Anfang an neu starten muss, wenn er jemals unterbrochen wird (z. B. aufgrund von Konnektivitätsproblemen oder einem Systemneustart).

Informationen zu den verfügbaren Prioritäten und dazu, wie BITS die Prioritätsstufe zum Planen von Aufträgen verwendet, finden Sie unter BG_JOB_PRIORITY.

Vorübergehende und schwerwiegende Fehler

Einige Fehler sind behebbar, andere nicht. Beispielsweise ist der Fehler "Server ist nicht verfügbar" ein wiederherstellbarer Fehler, und der Fehler "Zugriff verweigert" ist ein schwerwiegender Fehler. BITS versetzt wiederherstellbare Fehler in einen vorübergehenden Fehlerzustand und versucht den Auftrag nach einem angegebenen Intervall erneut. Wenn der Auftrag keinen Fortschritt erzielen kann, verschiebt BITS den Auftrag in einen schwerwiegenden Fehlerzustand. Verwenden Sie die Methoden IBackgroundCopyJob::SetMinimumRetryDelay und IBackgroundCopyJob::SetNoProgressTimeout , um zu steuern, wie BITS vorübergehende Fehler verarbeitet.

Bei Vordergrundaufträgen sollten Sie die Zeitspanne begrenzen, in der ein Auftrag im Status "Vorübergehender Fehler" verbleibt und versucht, die Wiederherstellung durchzuführen. Verwenden Sie die SetNoProgressTimeout-Methode , um die Zeitspanne zu begrenzen, die ein Auftrag im Vorübergehenden Fehlerzustand verbleibt, oder um den Auftrag in den Status schwerwiegender Fehler zu erzwingen. Wenn Sie zulassen, dass der Auftrag wiederhergestellt werden soll, sollten Sie die SetMinimumRetryDelay-Methode verwenden, um die minimale Wiederholungsverzögerung auf 60 Sekunden festzulegen, oder die IBackgroundCopyJob::Resume-Methode aufrufen, um den Auftrag erneut zu aktivieren.

Weitere Informationen finden Sie unter BG_JOB_STATE, Lebenszyklus eines BITS-Auftrags und Behandeln von Fehlern.

Messen der Netzwerkbandbreitennutzung

BITS kann den Netzwerkadapter des Clients verwenden, um die verfügbare Netzwerkbandbreite zu schätzen. Da BITS nicht in der Lage ist, die Bandbreite über den Client hinaus zu messen, kann BITS die WAN-Verbindung überlasten. Um die Überlastung der WAN-Verbindung zu verringern, können Sie die MaxInternetBandwidth-Gruppenrichtlinie verwenden, um die vom Client verwendete Bandbreite zu begrenzen. Weitere Informationen finden Sie unter Netzwerkbandbreite und Gruppenrichtlinien.

Wenn Sie eine Anwendung schreiben, die von vielen Clients zum Herunterladen von Dateien von einem bestimmten Server verwendet wird, sollten Sie ein Schema in Betracht ziehen, das die Downloadanforderungen staffelt, sodass Sie den Server nicht mit Anforderungen überladen.

Festlegen von Anmeldeinformationen für die Proxy- und Serverauthentifizierung

Wenn Sie erwarten, dass der Proxy oder Server Benutzeranmeldeinformationen erfordert, müssen Sie die Anmeldeinformationen für BITS angeben. Um die Anmeldeinformationen anzugeben, rufen Sie die IBackgroundCopyJob2::SetCredentials-Methode auf. BITS unterstützt die Authentifizierungsschemas Basic, Digest, Negotiate, NTLM und Passport.

Ausführliche Informationen zur Authentifizierung finden Sie unter Authentifizierung.

Angeben von Proxyeinstellungen für Benutzerkonten und Dienstkonten

Standardmäßig verwendet BITS die Internet-Explorer Proxyeinstellungen des Benutzers. Um die Internet-Explorer Proxyeinstellungen des Benutzers außer Kraft zu setzen, rufen Sie die IBackgroundCopyJob::SetProxySettings-Methode auf.

Die Internet-Explorer Proxyeinstellungen gelten nicht für Systemkonten, sodass das Standardproxyverhalten (BG_JOB_PROXY_USAGE_PRECONFIG) nur in WPAD-Bereitstellungen (Web Proxy Auto Discovery Protocol) ordnungsgemäß funktioniert, es sei denn, es werden zusätzliche Konfigurationsschritte ausgeführt. Wenn Ihre Anwendung ein Dienst ist, der als LocalSystem, LocalService oder NetworkService ausgeführt wird, sollten Sie ein Hilfstoken für Ihre BITS-Aufträge konfigurieren oder die richtigen Proxyeinstellungen explizit festlegen, indem Sie IBackgroundCopyJob::SetProxySettings mit BG_JOB_PROXY_USAGE_OVERRIDE aufrufen. Alternativ können Sie die Schalter /Util /SetIEProxy von BitsAdmin.exe verwenden, um Internet-Explorer-Proxyeinstellungen für das Systemkonto LocalSystem, LocalService oder NetworkService festzulegen. Weitere Informationen finden Sie unter BitsAdmin Tool.

BITS erkennt die Proxyeinstellungen nicht, die mithilfe der Proxycfg.exe-Datei festgelegt werden.

Ab dem Windows 10 October 2018 Update (10.0; Build 17763), verwendet BITS dieselbe Proxyreihenfolge, die WinHttp mit AUTOMATIC_PROXY verwendet. BITS verwendet diese kompatiblere Reihenfolge, wenn BG_JOB_PROXY_USAGE_PRECONFIG angegeben wird. BG_JOB_PROXY_USAGE_PRECONFIG ist der Standardwert für die Angabe des HTTP-Proxys.

Angeben von benutzerspezifischen Einstellungen für die Authentifizierung von Proxys

Wenn Sie BITS in einer Umgebung verwenden, die eine Proxyauthentifizierung erfordert, während Sie als Konto ohne verwendbare NTLM- oder Kerberos-Anmeldeinformationen in der Netzwerkdomäne des Computers ausgeführt werden, müssen Sie zusätzliche Schritte ausführen, um sich ordnungsgemäß zu authentifizieren, indem Sie die Anmeldeinformationen eines anderen Benutzerkontos verwenden, das über Anmeldeinformationen für die Domäne verfügt. Dies ist ein typisches Szenario, wenn Ihr BITS-Code als Systemdienst wie LocalService, NetworkService oder LocalSystem ausgeführt wird, da diese Konten nicht über verwendbare NTLM- oder Kerberos-Anmeldeinformationen verfügen.

Ausführliche Informationen zur Funktionsweise der Authentifizierung in diesem Szenario finden Sie unter Authentifizierung.

Skalierbarkeit

Wenn sich mehr als 100 Aufträge in der Warteschlange befinden, kann die Leistung je nach Auftragszusammensetzung abnimmt. BITS verwendet die MaxJobsPerMachine-Richtlinieneinstellung , um ein festes Limit für die Anzahl von Aufträgen in der Warteschlange festzulegen. Bewerbungen sollten die Anzahl ihrer Arbeitsplätze auf etwa 10 beschränken, sodass mehrere Bewerbungen eine geringere Chance haben, die 100-Stellen-Richtlinie zu überschreiten. In der Regel würde eine Anwendung mit einer großen Anzahl von zu übermittelnden Aufträgen zuerst 10 Aufträge übermitteln und dann nach Abschluss jedes Auftrags einzeln übermitteln.

Die Anzahl der Dateien im Auftrag sollte ebenfalls auf maximal 10 Dateien beschränkt werden. Wenn Sie eine große Anzahl von Dateien für einen Auftrag übertragen möchten, sollten Sie stattdessen eine CAB-Datei erstellen, die alle Dateien enthält.

HTTP-Header können in jedem Fall sein.

Die HTTP-Standards haben immer gesagt, dass HTTP-Header als nicht beachtet werden müssen (RFC 7230, Abschnitt 3.2). Der neueste HTTP-Standard RFC 7540 geht noch weiter und besagt, dass HTTP/2-Datenverkehr die Header als ohne Beachtung der Groß-/Kleinschreibung vergleichen muss und Header in Kleinbuchstaben darstellen muss (RFC 6540, Abschnitt 8.1.2). Selbst wenn Datenverkehr mit Nicht-Kleinbuchstaben-Headern gesendet wird, können Proxys die Kopfzeilen möglicherweise in Kleinbuchstaben erzwingen.

Vermeiden von personenbezogenen Informationen (PII)

BITS-Aufträge, einschließlich des Auftragsanzeigenamens, der Beschreibung und der Dateinamen, sind für alle Benutzer mit Administratorrechten sichtbar. Sie können auch zu Windows-Telemetrie hinzugefügt werden. Sie sollten vermeiden, vertrauliche Daten (z. B. den eigenen Namen des Benutzers) in die Auftragsdetails einzufügen.