So wird's gemacht: Herunterladen einer Datei
Inhaltsverzeichnis reduzieren
Inhaltsverzeichnis erweitern
Language: HTML | XAML

So wird’s gemacht: Herunterladen einer Datei (XAML)

[ Dieser Artikel richtet sich an Windows 8.x- und Windows Phone 8.x-Entwickler, die Windows-Runtime-Apps schreiben. Wenn Sie für Windows 10 entwickeln, finden Sie weitere Informationen unter neueste Dokumentation]

In diesem Thema wird erläutert, wie Sie eine Datei herunterladen.

Apps können mithilfe der in diesem Thema behandelten APIs mit Webdiensten interagieren, um gängige Medienformate wie Fotos, Musik und Video zu verwenden oder zu teilen.

Beim Entwickeln einer App in C# oder C++ stehen drei primäre Optionen zur Verfügung, mit denen Sie Dateien von Speicherorten im Internet anfordern können. Kleine Dateien (z. B. häufig abgerufene Websiteobjekte) können mit den APIs HttpClient (C#) und IXMLHTTPRequest2 (C++) heruntergeladen werden.

Alternativ kann die App bei größeren Downloads (Video und Musik), während derer vielleicht die App mehrmals angehalten wird und/oder das Netzwerk nicht immer verfügbar ist, Background Transfer verwenden. Allgemeine Informationen zu Hintergrundübertragungen finden Sie unter Übertragen von Daten im Hintergrund.

Voraussetzungen

Allgemeine Informationen zum Erstellen einer Windows-Runtime-App mit C# finden Sie unter Erstellen Ihrer ersten Windows-Runtime-App mit C# oder Visual Basic. Allgemeine Informationen zum Erstellen einer Windows-Runtime-App mit C++ finden Sie unter Erstellen Ihrer ersten Windows-Runtime-App mit C++.

Damit Ihre App im Netzwerk verwendet werden kann, müssen Sie die entsprechende Funktion in der Projektdatei Package.appxmanifest festlegen. Definitionen zu den einzelnen Netzwerkfunktionen finden Sie unter So wird's gemacht: Konfigurieren von Netzwerkisolationsfunktionen.

In den folgenden Beispielen zur Hintergrundübertragung wird C# verwendet. Die diese Beispiele basieren auf dem Beispiel für eine Hintergrundübertragung.

Namespacedeklarationen

Die folgenden Windows-Runtime- und .NET-Namespaces werden in diesem Thema verwendet.


using System;
using System.Collections.Generic;
using System.Net.HttpClient;
using System.Threading;
using System.Threading.Tasks;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.Networking.BackgroundTransfer;
using Windows.Storage.Pickers;
using Windows.Storage;

Herunterladen mit "HttpClient"

  1. Zuerst erstellen wir das HttpClient-Objekt. Zwei Eigenschaftswerte für das HttpClient-Objekt sollten ggf. überprüft werden, um sicherzustellen, dass die erforderlichen Aspekte einer Anforderung berücksichtigt werden. Der Standardwert der HttpClient.MaxResponseContentBufferSize-Eigenschaft lautet "64K". Wenn die Größe der Antwort diesen Wert überschreitet, tritt ein Fehler auf.

    Außerdem ist zu berücksichtigen, dass bei einer mit HttpClient erstellten HTTP-Anforderung standardmäßig kein Benutzer-Agent-Header gesendet wird. Einige HTTP-Server, darunter einige von Microsoft, verlangen aber, dass ein Benutzer-Agent-Header in die HTTP-Anforderungen vom Client eingefügt wird. Diese Server geben andernfalls einen Fehler zurück.

    Um das Festlegen dieser Eigenschaften zu veranschaulichen, initialisieren wir im folgenden Beispiel ein HttpClient-Objekt und definieren Werte für die Eigenschaften MaxResponseContentBufferSize und DefaultRequestHeaders.

    
    private HttpClient httpClient;
    
    public BlankPage()
    {
        this.InitializeComponent();
        httpClient = new HttpClient();
        // Increase the max buffer size for the response so we don't get an exception with so many web sites
        httpClient.MaxResponseContentBufferSize = 256000;
        httpClient.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");
    }
    
    
  2. HttpClient ist so konfiguriert, dass eine den Anforderungen des Szenarios entsprechende Anforderung gesendet wird, und durch Übergeben einer gültigen Adresse an HttpClient.GetAsync wird die GET-Anforderung gesendet. In diesem Beispiel wird die Adresse als Zeichenfolge mithilfe eines Eingabefelds auf der Benutzeroberfläche bereitgestellt, und der Antworttext wird mithilfe eines Ausgabefelds angezeigt. Die Antwort auf die Anforderung wird durch ein HttpResponseMessage-Objekt dargestellt, das nach Abschluss des HttpClient.GetAsync-Vorgangs erstellt wird. Außerdem wird durch Aufrufen von HttpResponseMessage.EnsureSuccessStatusCode sichergestellt, dass eine Ausnahme ausgelöst wird, wenn als Antwort auf die GET-Anforderung ein Fehler zurückgegeben wird. Bei erfolgreicher Ausführung werden die angeforderten Daten durch die HttpResponseMessage.Content-Eigenschaft dargestellt.

    
    private async void Start_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            string responseBodyAsText;
            OutputView.Text = "";
            StatusText.Text = "Waiting for response ...";
    
            HttpResponseMessage response = await httpClient.GetAsync(InputAddress.Text);
            response.EnsureSuccessStatusCode();
    
            StatusText.Text = response.StatusCode + " " + response.ReasonPhrase + Environment.NewLine;
            responseBodyAsText = await response.Content.ReadAsStringAsync();
            responseBodyAsText = responseBodyAsText.Replace("<br>", Environment.NewLine); // Insert new lines
            OutputView.Text = responseBodyAsText;
        }
        catch (HttpRequestException hre)
        {
            StatusText.Text = hre.ToString();
        }
        catch (Exception ex)
        {
            // For debugging
            StatusText.Text = ex.ToString();
        }
    }
    
    

    Hinweis  Bei Verwendung des await-Schlüsselworts in C# und Visual Basic ähnelt der Code zum Senden der GET-Anforderung und asynchronen Abrufen der Antwort dem Code, der zur synchronen Ausführung dieses Vorgangs verwendet würde. Das await-Schlüsselwort kann nur verwendet werden, wenn die Methode mit dem async-Schlüsselwort als asynchron definiert wurde.
     

Herunterladen einer Datei mithilfe der Hintergrundübertragung

Bei der Hintergrundübertragung erfolgt jeder Download als DownloadOperation. Dabei werden eine Reihe von Steuerungsmethoden zum Anhalten, Fortsetzen, Neustarten und Abbrechen des Vorgangs verfügbar gemacht. App-Ereignisse (z. B. Beenden) und Konnektivitätsänderungen werden vom System automatisch durch DownloadOperation behandelt. Downloads werden während des Anhaltens oder Unterbrechens einer App und auch nach dem Beenden der App fortgesetzt. Außerdem wird durch Festlegen der CostPolicy-Eigenschaft angegeben, ob die App Downloads startet oder fortsetzt, wenn für die Internetkonnektivität ein getaktetes Netzwerk verwendet wird.

In den folgenden Beispielen werden die Erstellung und Initialisierung eines einfachen Downloads sowie das Aufzählen und Fortsetzen von in einer vorherigen App-Sitzung gespeicherten Vorgängen erläutert.

JJ152726.wedge(de-de,WIN.10).gifKonfigurieren und Erstellen eines Downloads

  • Um das Konfigurieren und Erstellen eines neuen Downloads zu veranschaulichen, haben wir eine Beispielklasse erstellt, die ein neues DownloadOperation-Objekt anhand der BackgroundDownloader-Klasse erstellt, wenn die erforderlichen StorageFile- und Uri-Werte übergeben werden. Die angegebene fileName-Zeichenfolge wird von createFileAsync verwendet, um die StorageFile im Ordner "Pictures" zu erstellen. Die uriString-Zeichenfolge, die den Speicherort der Webressource darstellt, wird zum Erstellen des Uri-Objekts verwendet.

    Nachdem der Download konfiguriert wurde, wird HandleDownloadAsync aufgerufen, um vor dem Initiieren des Downloads Status- und Abschlusshandler an den Vorgang anzufügen.

    
    private async void StartDownload_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            Uri source = new Uri(serverAddressField.Text.Trim());
            string destination = fileNameField.Text.Trim();
    
            if (destination == "")
            {
                Log("A local file name is required.");
                return;
            }
    
            StorageFile destinationFile = await KnownFolders.PicturesLibrary.CreateFileAsync(
                destination, CreationCollisionOption.GenerateUniqueName);
    
            BackgroundDownloader downloader = new BackgroundDownloader();
            DownloadOperation download = downloader.CreateDownload(source, destinationFile);
    
            Log(String.Format("Downloading {0} to {1}, {2}", source.AbsoluteUri, destinationFile.Name, download.Guid));
    
            // Attach progress and completion handlers.
            HandleDownloadAsync(download, true);
         }
         catch (Exception ex)
         {
             LogException("Download Error", ex);
         }
    }
    
    
    Hinweis  Ihre App kann auch die FileSavePicker-Klasse implementieren, damit der Endbenutzer den Dateinamen und Speicherort über die Benutzeroberfläche eingeben kann.
     

JJ152726.wedge(de-de,WIN.10).gifAnfügen von Statushandlern und Starten eines Downloads

  • Dies ist die HandleDownloadAsync-Beispielmethode. Sie erledigt die eigentliche Arbeit zum Anfügen von Handlern an neue DownloadOperations (bevor sie durch Aufrufen vonstartAsync initiiert werden) oder zum erneuten Anfügen von Handlern anDownloadOperations, die in der aktuellen App-Sitzung permanent gespeichert wurden. Die Methode wird außerdem verwendet, um den Status während der gesamten Lebensdauer des Vorgangs zu melden und einen DownloadOperation bei seinem Abschluss oder Abbruch aus der activeDownloads-Liste zu entfernen.

    
    private async void HandleDownloadAsync(DownloadOperation download, bool start)
    {
        try
        {   
            // Store the download so we can pause/resume.
            activeDownloads.Add(download);
     
            Progress<DownloadOperation> progressCallback = new Progress<DownloadOperation>(DownloadProgress);
            if (start)
            {
               // Start the download and attach a progress handler.
               await download.StartAsync().AsTask(cts.Token, progressCallback);
            }
            else
            {
               // The download was already running when the application started, re-attach the progress handler.
               await download.AttachAsync().AsTask(cts.Token, progressCallback);
            }
    
            ResponseInformation response = download.GetResponseInformation();
            Log(String.Format("Completed: {0}, Status Code: {1}", download.Guid, response.StatusCode));
        }
        catch (TaskCanceledException)
        {
            Log("Download cancelled.");
        }
        catch (Exception ex)
        {
            LogException("Error", ex);
        }
        finally
        {
            activeDownloads.Remove(download);
        }
    }
    
    

    Hinweis  In diesem Beispiel wird auf Methoden verwiesen, die das App-Verhalten abhängig vom aktuellen Status eines Downloads definieren. Beispiele für dieses Verhalten erhalten Sie, wenn Sie das Beispiel für eine Hintergrundübertragung herunterladen.
     

JJ152726.wedge(de-de,WIN.10).gifAufzählen beibehaltener Vorgänge beim Start

  • Der folgende Code zählte alle DownloadOperation-Instanzen auf und durchläuft die Liste. Dabei wird die HandleDownloadAsync-Methode (wird weiter unten in diesem Thema erläutert) aufgerufen, um die Status- und Abschlusshandler erneut anzufügen. Diese Aufzählungsaufgabe muss nur zu Beginn einer App-Sitzung ausgeführt werden, da dieses Szenario nur auftritt, wenn die App während Übertragungen beendet wird.

    activeDownloads = new List<DownloadOperation>();
    
    IReadOnlyList<DownloadOperation> downloads = await BackgroundDownloader.GetCurrentDownloadsAsync();
    
    if (downloads.Count > 0)
    {
        List<Task> tasks = new List<Task>();
        foreach (DownloadOperation download in downloads)
        {
    
            // Attach progress and completion handlers.
            tasks.Add(HandleDownloadAsync(download, false));
        }
          
    }
    
    

    Hinweis  

    Für Windows Phone Store-Apps werden Hintergrundübertragungen fortgesetzt, während Ihre App nicht im Vordergrund ausgeführt wird. Da Ihre App in einem solchen Szenario nicht ausgeführt wird, erhält sie keine Benachrichtigung, wenn die Übertragung abgeschlossen ist. Wenn Ihre App fortgesetzt wird und Sie nur den Status einer abgeschlossenen Übertragung überprüfen, wird BackgroundTransferStatus.Running als Status zurückgegeben. Fügen Sie aber wie im obigen Beispiel einen Handler an die Übertragung an, wird der Aufgabenabschlusshandler ausgelöst, und der Übertragungsstatus wird aktualisiert.

Zeitüberschreitungen bei Anforderungen

Es müssen zwei primäre Szenarien zu Verbindungszeitüberschreitungen berücksichtigt werden:

  • Beim Herstellen einer neuen Verbindung für die Übertragung wird die Verbindungsanforderung abgebrochen, wenn die Verbindung nicht innerhalb von fünf Minuten hergestellt wird.

  • Nach dem Herstellen einer Verbindung wird eine HTTP-Anforderungsnachricht abgebrochen, auf die nicht innerhalb von zwei Minuten reagiert wurde.

Hinweis  In der Annahme, dass Internetkonnektivität besteht, wiederholt die Hintergrundübertragung in beiden Szenarien eine Anforderung automatisch bis zu drei Mal. Wenn keine Internetkonnektivität erkannt wird, warten zusätzliche Anforderungen, bis Konnektivität vorhanden ist.
 

Debugging-Leitfaden

Das Beenden einer Debugsitzung in Microsoft Visual Studio ist mit dem Schließen der App vergleichbar. Auch beim Debuggen sollte die App alle von der vorhergehenden Sitzung beibehaltenen Downloads auflisten und dann fortsetzen, neu starten oder abbrechen. Sie können beispielsweise aufgelistete beibehaltene Downloadvorgänge beim App-Start durch die App abbrechen lassen, wenn kein Interesse an vorherigen Operationen für die aktuelle Debugsitzung besteht.

GetCurrentUploadsAsync kann Vorgänge nicht auflisten, die mithilfe der vorherigen App-Bereitstellung erstellt werden, wenn Visual Studio-Projektupdates, wie Änderungen am App-Manifest, vorhanden sind und die App deinstalliert und erneut bereitgestellt wird.

Weitere Informationen finden Sie unter Debuggen und Testen von Windows Store-Apps.

Bei der Verwendung von Hintergrundübertragungen während der Entwicklung kann es vorkommen, dass die internen Caches aktiver und abgeschlossener Übertragungsvorgänge nicht mehr synchron sind. Dies kann zur Folge haben, dass keine neuen Übertragungsvorgänge gestartet werden können, oder dass keine Interaktion mit vorhandenen Vorgängen und BackgroundTransferGroup-Objekten mehr möglich ist. In einigen Fällen wird durch den Versuch einer Interaktion mit vorhandenen Vorgängen ein Absturz ausgelöst. Dies kann vorkommen, wenn die TransferBehavior-Eigenschaft auf Parallel festgelegt ist. Dieses Problem tritt nur bei bestimmten Szenarien während der Entwicklung auf und betrifft nicht die Endbenutzer Ihrer App.

Vier Szenarien mit Visual Studio können dieses Problem auslösen.

  • Sie erstellen ein neues Projekt mit demselben App-Namen wie ein vorhandenes Projekt, jedoch einer anderen Sprache (z. B. C# statt C++).
  • Sie ändern die Zielarchitektur (z. B. von x86 zu x64) in einem vorhandenen Projekt.
  • Sie ändern die Kultur (z. B. von neutral zu en-US) in einem vorhandenen Projekt.
  • Sie fügen in einem vorhandenen Projekt eine Funktion im Paketmanifest (z. B. Unternehmensauthentifizierung) hinzu oder entfernen eine.
Normale App-Wartungen wie z. B. Manifestaktualisierungen, bei denen Funktionen hinzugefügt oder entfernt werden, lösen dieses Problem in den Bereitstellungen Ihrer App für Endbenutzer nicht aus.

Umgehen Sie dieses Problem, indem Sie alle Versionen der App vollständig deinstallieren und sie mit der neuen Sprache, Architektur, Kultur oder Funktion erneut bereitstellen. Dies ist auf der Startseite oder mithilfe von PowerShell und dem Remove-AppxPackage-Cmdlet möglich.

Zusammenfassung und nächste Schritte

Sie haben in diesem Thema erfahren, wie Dateien mit den APIs HttpClient (C#) und Background Transfer (C#/C++) heruntergeladen werden. Wir haben die Unterschiede zwischen den beiden APIs erläutert und veranschaulicht, wie praktische Anwendungen von der Größe und Dauer einer Dateiübertragung abhängen.

Sie können die Hintergrundübertragung auch zum Hochladen von Dateien verwenden. Eine Erläuterung der wichtigsten Konzepte und Beispiele finden Sie unter Schnellstart: Hochladen von Dateien.

Verwandte Themen

Weitere Themen
Erstellen Ihrer ersten Windows-Runtime-App mit C# oder Visual Basic
Erstellen Ihrer ersten Windows-Runtime-App mit C++
So wird's gemacht: Konfigurieren von Netzwerkfunktionen
So wird's gemacht: Behandeln von Ausnahmen in Netzwerk-Apps
So wird's gemacht: Hochladen einer Datei
Übertragen von Daten im Hintergrund
Referenz
HttpClient
Windows.Networking.BackgroundTransfer
XML für HTTP-Anforderung 2
Beispiele
Beispiel für eine Hintergrundübertragung
HttpClient-Beispiel
XML-Beispiel für HTTP-Anforderung 2 – GET

 

 

Anzeigen:
© 2017 Microsoft