Schnellstart: Herunterladen von Dateien (Windows Store-Apps mit C#/VB/C++ und XAML)

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

Windows Store-Apps können mithilfe der in diesem Thema behandelten APIs mit Webdiensten interagieren, um verbreitete Medienformate wie Fotos, Musik und Video zu verwenden oder zu teilen.

Beim Entwickeln einer Windows Store-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, beispielsweise häufig abgerufene Websiteassets, können mit den APIs HttpClient (C#) und IXMLHTTPRequest2 (C++) heruntergeladen werden.

Alternativ kann die Windows Store-App bei größeren Downloads (Video und Musik), während derer möglicherweise 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

Anweisungen zum Erstellen einer Windows Store-App mit C# oder C++ finden Sie unter Erstellen Ihrer ersten Windows Store-App mit C# oder Visual Basic.

Damit die Windows Store-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 JavaScript verwendet; diese Beispiele basieren auf dem Downloadbeispiel für die 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 möglicherweise ü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));
        }
          
    }
    
    
    

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.

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

Download-Beispiel für die Hintergrundübertragung
XML-Beispiel für HTTP-Anforderung 2 – GET
XML für HTTP-Anforderung 2
System.Net.HttpClient
Windows.Networking.BackgroundTransfer

 

 

Anzeigen:
© 2014 Microsoft. Alle Rechte vorbehalten.