Alle Windows Phone-Geräte verfügen über eine integrierte Netzwerkverbindung. Aus dem gleichen Grund haben wir gelernt, wie Daten lokal gespeichert werden. Wir müssen bereit sein, zu verwalten, wie Benutzer unsere Anwendung verwenden, während eine Verbindung fehlt.
Zu diesem Zweck enthält das Windows Phone-Framework eine Klasse, mit der Informationen über die aufgerufene Internetverbindung ermittelt werden können DeviceNetworkInformation
, was ist ein Teil der Microsoft.Phone.Net.NetworkInformation
Namespace.
Der wichtigste ist IstNetzwerk verfügbar
, was uns sagt, ob eine Internetverbindung verfügbar ist. Wir sollten diese API immer verwenden, bevor Sie einen Vorgang ausführen, für den eine Verbindung erforderlich ist, wie im folgenden Beispiel:
private void OnCheckConnectionClicked (Objektsender, RoutedEventArgs e) if (DeviceNetworkInformation.IsNetworkAvailable) MessageBox.Show ("Sie sind mit dem Internet verbunden"); // Netzwerkoperationen durchführen. else MessageBox.Show ("Sie sind nicht mit dem Internet verbunden");
Die Klasse bietet auch ein Ereignis namens an NetworkAvailableChanged
Das wird jedes Mal ausgelöst, wenn sich der Verbindungsstatus ändert. Dies ist nützlich, wenn Sie schnell auf Netzwerkänderungen reagieren möchten, z. B. bestimmte Anwendungsfunktionen aktivieren oder deaktivieren.
public MainPage () InitializeComponent (); DeviceNetworkInformation.NetworkAvailableChanged + = DeviceNetworkInformation_NetworkAvailableChanged; private void DeviceNetworkInformation_NetworkAvailableChanged (Objektsender, NetworkNotificationEventArgs e) if (e.NotificationType == NetworkNotificationType.InterfaceDisconnected) MessageBox.Show ("Disconnected"); else if (e.NotificationType == NetworkNotificationType.InterfaceConnected) MessageBox.Show ("Connected");
Die Rückgabeparameter enthalten eine aufgerufene Eigenschaft Benachrichtigungstyp
, des Typs NetworkNotificationType
, was uns den aktuellen Netzwerkstatus angibt.
Jedoch mit der DeviceNetworkInformation
Sie können auch andere Informationen zum aktuellen Netzwerkstatus abrufen, z. B. ob der Benutzer die Mobilfunkdatenverbindung aktiviert hat (IsCellularDataEnabled
), die Wi-Fi-Verbindung (IsWiFiEnabled
) oder Roaming-Optionen (IsCellularDataRoamingOptions
).
Das Framework bietet eine weitere nützliche Klasse zum Umgang mit aufgerufenen Netzwerkverbindungen Netzwerkschnittstelle
. Mit der NetworkInterfaceType
Mit dieser Eigenschaft können Sie feststellen, welcher Verbindungstyp derzeit verwendet wird. Mit dieser Eigenschaft können Sie beispielsweise das Herunterladen großer Dateien während einer Mobilfunkverbindung vermeiden.
NetworkInterfaceType
ist ein Enumerator, der viele Werte annehmen kann. Die wichtigsten sind:
MobileBroadbandGsm
und MobileBroadbandCdma
wenn das Telefon an ein Mobilfunknetz angeschlossen ist (GSM oder CDMA, je nach Land)Wireless80211
, Wenn das Telefon mit einem Wi-Fi-Netzwerk verbunden istIm folgenden Beispiel wird eine Nachricht mit dem aktuellen Verbindungstyp auf dem Bildschirm angezeigt:
private void OnCheckConnectionTypeClicked (Objektsender, RoutedEventArgs e) if (NetworkInterface.NetworkInterfaceType == NetworkInterfaceType.MobileBroadbandGsm || NetworkInterface.NetworkInterfaceType == NetworkInterfaceType.MobileBroadbandCdma) MessageBox. else if (NetworkInterface.NetworkInterfaceType == NetworkInterfaceType.Wireless80211) MessageBox.Show ("Wi-Fi");
Das Windows Phone-Framework verfügt über zwei integrierte Klassen zum Ausführen von Netzwerkvorgängen: WebClient
und HttpWebRequest
. Leider ist keiner von ihnen perfekt. WebClient
ist sehr einfach zu bedienen, basiert aber auf dem alten Callback - Ansatz (sofern Sie nicht die Asynchron für .NET Paket, das wir zuvor in dieser Serie besprochen haben). HttpWebRequest
ist sehr mächtig, aber es ist komplex zu bedienen und basiert auf einem alten asynchronen Muster, das schwer zu verstehen ist.
Die Windows-Laufzeitumgebung hat eine neue Klasse eingeführt HttpClient
, das nimmt das Beste aus beiden Welten. Es ist leistungsstark und bietet eine hervorragende Leistung, ist aber einfach zu bedienen und bietet Methoden, die auf dem neuen asynchronen und wartenden Muster basieren. Diese Klasse ist in den vollständigen Windows Runtime für Windows Store-Apps verfügbar. Sie ist jedoch nicht im Windows Phone Runtime-Subset enthalten. Sie müssen sie von NuGet aus installieren.
Das HttpClient
Klasse ist, wie wir später sehen werden, nicht nur für allgemeine Netzwerkvorgänge wie das Herunterladen und Hochladen von Dateien, sondern auch für die Interaktion mit Webdiensten von Vorteil. Tatsächlich werden für jeden HTTP-Befehl asynchrone Methoden wie GET, POST, PUT usw. bereitgestellt.
Hinweis: Damit Sie mit dem Netzwerk interagieren können, müssen Sie die Option ID_CAP_NETWORKING in der Manifestdatei aktivieren. Sie ist standardmäßig in jedem neuen Windows Phone-Projekt aktiviert.
Dateien werden normalerweise mit dem Befehl GET HTTP heruntergeladen HttpClient
bietet das an GetAsync ()
Methode. Das Leben der Entwickler einfacher gestalten, HttpClient
verfügt über einige integrierte Methoden zum Herunterladen der häufigsten Dateitypen, z. B. GetStringAsync ()
zum Herunterladen von Textdateien wie XML-, RSS- oder REST-Antworten; oder GetByteArrayAsync ()
und GetStreamAsync ()
um den Inhalt der binären Datei zu erhalten.
Das Herunterladen von Strings ist sehr einfach. Die Methode GetStringAsync ()
Erfordert als Parameter die URL der Datei und gibt den Inhalt der Datei als Zeichenfolge zurück. Im folgenden Beispiel können Sie sehen, wie Sie den RSS-Feed meines Blogs herunterladen:
privat async void OnDownloadStringClicked (Objektsender, RoutedEventArgs e) HttpClient client = new HttpClient (); Zeichenfolge result = Erwarte Client.GetStringAsync ("http://feeds.feedburner.com/qmatteoq_eng");
Sobald Sie die Zeichenfolge haben, können Sie die erforderlichen Vorgänge entsprechend Ihrem Szenario ausführen. Im vorherigen Beispiel hätte ich beispielsweise das zurückgegebene XML mit LINQ to XML analysieren lassen, um die Nachrichtenliste auf dem Bildschirm anzuzeigen.
Das Herunterladen von Binärdateien kann auf verschiedene Arten erfolgen. Sie können verwenden GetByteArrayAsync ()
wenn Sie lieber mit Bytes arbeiten, oder GetStreamAsync ()
wenn Sie den Inhalt der Datei lieber als Stream bearbeiten möchten.
Im folgenden Beispiel sehen Sie, wie Sie ein Bild mit Hilfe von herunterladen GetByteArrayAsync ()
Methode. Es gibt das Byte eines Bytes zurück, das mit den APIs, über die wir zuvor in dieser Serie erfahren haben, problemlos im lokalen Speicher gespeichert werden kann.
privat async void OnDownloadFileClicked (Objektsender, RoutedEventArgs e) HttpClient client = new HttpClient (); byte [] bytes = Erwarte Client.GetByteArrayAsync ("http://www.syncfusion.com/Content/en-US/Home/Images/syncfusion-logo.png"); StorageFile storageFile = await ApplicationData.Current.LocalFolder.CreateFileAsync ("picture.png", CreationCollisionOption.ReplaceExisting); IRandomAccessStream accessStream = waitFile.OpenAsync (FileAccessMode.ReadWrite) erwarten; using (IOutputStream outputStream = accessStream.GetOutputStreamAt (0)) DataWriter writer = neuer DataWriter (outputStream); writer.WriteBytes (Bytes); Erwarten Sie Writer.StoreAsync ();
Mit der DataWriter
Klasse, können wir das Byte-Array speichern, das vom zurückgegeben wird HttpClient
Klasse in eine Datei im lokalen Speicher namens picture.png.
Wenn Sie die vollständige Kontrolle über den Download-Vorgang benötigen, können Sie das Generic verwenden GetAsync ()
Methode, die a zurückgibt HttpResponseMessage
Objekt mit dem gesamten Inhalt der Antwort, wie Kopfzeilen, Statuscode usw.
Im folgenden Beispiel können Sie sehen, wie mit der GetAsync ()
Methode, können wir ein Bild als herunterladen Strom
und zeigen Sie es in einem Bild
Steuerelement auf der Seite platziert. An die Methode übergeben wir einen zweiten Parameter vom Typ HttpCompletionOption
, Damit wird der Klasse mitgeteilt, wann die Operation als abgeschlossen markiert werden soll. Da wir den vollen Inhalt der Antwort (das heruntergeladene Bild) wünschen, verwenden wir die ResponseContentRead
Möglichkeit.
privat async void OnDownloadStreamClicked (Objektsender, RoutedEventArgs e) HttpClient client = new HttpClient (); HttpResponseMessage httpResponseMessage = Erwarte Client.GetAsync ("http://www.syncfusion.com/Content/en-US/Home/Images/syncfusion-logo.png", HttpCompletionOption.ResponseContentRead); Stream Stream = Erwarte httpResponseMessage.Content.ReadAsStreamAsync (); BitmapImage image = new BitmapImage (); image.SetSource (Stream); Logo.Source = Bild;
Beachten Sie, dass die spezifischen Methoden, die wir gesehen haben HttpClient
Klasse sind einfach eine Abkürzung zu den von der Inhalt
Eigentum der HttpResponseMessage
Klasse (im vorherigen Beispiel verwenden wir die ReadAsStreamAsync ()
Methode, um den Inhalt der Antwort als Strom
).
Das Hochladen von Daten erfolgt auf ähnliche Weise: Die Operation wird normalerweise mit dem POST-Befehl ausgeführt, also mit HttpClient
Klasse macht die PostAsync ()
Methode für diesen Zweck.
Der zu sendende Inhalt wird mit der HttpContent
Klasse, die viele Implementierungen bietet: StreamContent
um den Stream einer Datei zu senden, ByteArrayContent
eine binäre Datei senden, StringContent
eine Zeichenfolge senden oder MultipartFormDataContent
Senden von Inhalten, die mit dem MIME-Typ "multipart / form-data" codiert sind.
In dem folgenden Beispiel können Sie sehen, wie ein Dateistream zu einem Dienst hochgeladen wird:
private async void OnUploadFileClicked (Objektsender, RoutedEventArgs e) StorageFile storageFile = await ApplicationData.Current.LocalFolder.GetFileAsync ("picture.png"); IRandomAccessStream accessStream = waitFile.OpenAsync (FileAccessMode.ReadWrite) erwarten; HttpClient-Client = neuer HttpClient (); HttpContent content = new StreamContent (accessStream.AsStreamForRead ()); Erwarten Sie client.PostAsync ("http://wp8test.azurewebsites.net/api/values", Inhalt);
Nachdem wir den Stream einer im lokalen Speicher gespeicherten Datei abgerufen haben, übergeben wir ihn an eine neue Instanz von StreamContent
Klasse. Dann rufen wir die an PostAsync ()
Übergeben der URL des Dienstes und der HttpContent
Objekt als Parameter.
REST (Representational State Transfer) ist heutzutage zweifellos der am häufigsten verwendete Ansatz bei der Entwicklung von Webservices, insbesondere in der mobilen Welt.
REST-Dienste sind aus zwei Gründen sehr beliebt:
Nahezu jede Plattform unterstützt diese Technologien nativ, sodass Sie nicht nach speziellen Bibliotheken suchen müssen, um mit ihnen zu interagieren, wie dies für WSDL-basierte Webdienste erforderlich ist.
Wir haben schon gesehen wie mit dem HttpClient
Klasse ist es einfach, mit den Standard-HTTP-Befehlen mit dem Web zu interagieren. Um mit einem REST-Dienst zu interagieren, müssen Sie meistens den GetStringAsync ()
Methode, um die XML- oder JSON-Antwort abzurufen.
Nachdem Sie das Ergebnis erhalten haben, müssen Sie es meistens in Objekte konvertieren, die in der Anwendung verwendet werden sollen. Zu Beginn dieser Serie haben wir den einfachsten Weg zur Lösung dieser Aufgabe beschrieben: Deserialisierung, dh das Übersetzen von Text in komplexe Objekte. Wir können die verwenden DataContractSerializer
oder DataContractJsonSerializer
Klassen, um dies zu tun. In diesem Fall müssen Sie nur auf den Deserialisierungsprozess verweisen, da der Vorgang identisch ist.
private async void OnConsumeServiceClicked (Objektsender, RoutedEventArgs e) HttpClient client = new HttpClient (); Zeichenfolge result = Erwarte Client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values"); using (MemoryStream ms = neuer MemoryStream (Encoding.Unicode.GetBytes (Ergebnis))) DataContractJsonSerializer Serializer = neuer DataContractJsonSerializer (Typeof (List)); Liste people = serializer.ReadObject (ms) als Liste ;
Wir gehen davon aus, dass der Dienst im JSON-Format eine Liste von Personen zurückgibt:
["id": 1, "name": "Matteo", "Nachname": "Pagani", "id": 2, "name": "John", "Nachname": "Doe"]
Mit der Hilfe des DataContractJsonSerializer
Klasse können wir den vorherigen JSON in eine Liste von konvertieren Person
Objekte, was dieselbe Klasse ist, die wir in vielen anderen Proben dieser Serie verwendet haben. Der Unterschied in diesem Beispiel besteht darin, dass wir den Serialisierungsprozess steuern können, falls sich beispielsweise die von JSON zurückgegebenen Eigenschaftsnamen von den in unseren Klassen verwendeten unterscheiden. Dies ist ein sehr häufiges Szenario im Umgang mit JSON, da Eigenschaftennamen normalerweise Kleinbuchstaben sind, während sie in C # -Objekten CamelCase sind. Dieses Ergebnis wird durch die Verwendung von erreicht [DataMember]
Attribut, das auf die Eigenschaften angewendet werden kann, die wir serialisieren möchten. Im folgenden Beispiel sehen Sie, dass das Attribut eine aufgerufene Eigenschaft anbietet Name
, Mit dieser Option können Sie angeben, welcher Name der Eigenschaft in der JSON-Datei gefunden werden soll.
public class Person [DataMember (Name = "id")] public int Id get; einstellen; [DataMember (Name = "Name")] öffentliche Zeichenfolge Name get; einstellen; [DataMember (Name = "Nachname")] öffentliche Zeichenfolge Nachname get; einstellen;
Dieser Ansatz hat einen Nachteil: REST-Dienste geben immer eine einfache Zeichenfolge zurück, während die DataContractJsonSerializer
Klasse erfordert ein Strom
als Eingabeparameter des ReadObject ()
Methode, so sind wir immer gezwungen, es mit einem MemoryStream
Objekt.
Es gibt einen anderen Weg, um das gleiche Ergebnis zu erzielen. Lassen Sie mich JSON.NET vorstellen, eine Bibliothek von Drittanbietern, die einige nützliche Funktionen für den Umgang mit JSON-Daten bietet. Darüber hinaus bietet es eine bessere Leistung und kann komplexe JSON-Dateien schneller deserialisieren.
Es kann einfach mit NuGet installiert werden. Die offizielle Website bietet Vergleiche mit anderen JSON-Bibliotheken und eine detaillierte Dokumentation.
Im folgenden Beispiel verwenden wir JSON.NET, um dasselbe Ergebnis wie der zuvor verwendete Code zu erzielen:
private async void OnGetDataClicked (Objektsender, RoutedEventArgs e) HttpClient client = new HttpClient (); Zeichenfolge result = Erwarte Client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values"); Listepeople = JsonConvert.DeserializeObject > (Ergebnis);
Das JsonConvert
Klasse (die Teil der Newtonsoft.Json
Namensraum) macht die DeserializeObject
Methode, wo T
ist der Objekttyp, den wir als Gegenleistung erwarten. Als Eingabeparameter ist nur die JSON-Zeichenfolge erforderlich, die wir vom Dienst heruntergeladen haben.
Es ist auch möglich, den Deserialisierungsprozess mit Attributen zu steuern, wie wir es zuvor mit dem getan haben DataMember
Attribut. Im folgenden Beispiel können Sie sehen, wie wir manuell definieren können, wie JSON-Eigenschaften übersetzt werden sollen:
public class Person [JsonProperty ("id")] public int Id get; einstellen; [JsonProperty ("Name")] öffentliche Zeichenfolge Name get; einstellen; [JsonProperty ("Nachname")] öffentliche Zeichenfolge Nachname get; einstellen;
Tipp: Sie müssen häufig Dienste von Drittanbietern verwenden, damit Sie die genaue Zuordnung zwischen Entitäten und JSON-Daten nicht kennen. Es gibt eine Website, die Ihnen in diesem Szenario helfen wird: http://json2csharp.com/. Fügen Sie einfach die von Ihrem Dienst zurückgegebene JSON ein. Daraufhin werden die erforderlichen C # -Klassen für die Zuordnung der JSON-Daten generiert.
Ein weiteres interessantes Feature von JSON.NET ist LINQ to JSON, eine LINQ-basierte Sprache, die ähnlich wie LINQ to XML verwendet werden kann, um einen JSON-String zu manipulieren, um genau die Informationen zu extrahieren, die Sie benötigen. Dieser Ansatz ist nützlich, wenn Sie die Deserialisierung nicht wirklich verwenden müssen, sondern nur einige Daten aus der JSON-Antwort extrahieren müssen, die Sie vom Service erhalten haben.
Der Ausgangspunkt für die Verwendung von LINQ to JSON ist das JObject
Klasse, die eine JSON-Datei identifiziert. Um damit zu arbeiten, müssen Sie einfach die Parse ()
Übergeben Sie als Methode die JSON-Zeichenfolge, wie im folgenden Beispiel gezeigt:
private async void OnParseJson (Objektsender, RoutedEventArgs e) HttpClient client = new HttpClient (); Zeichenfolge result = Erwarte Client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values"); JObject json = JObject.Parse (Ergebnis);
Jetzt können Sie einige Operationen ausführen. Schauen wir uns die häufigsten an.
Einfaches JSON
Hier ist ein Beispiel für eine einfache JSON-Datei:
"Id": 1, "Name": "Matteo", "Nachname": "Pagani"
Mit LINQ to JSON können wir den Wert einer einzelnen Eigenschaft auf folgende Weise ermitteln:
private async void OnParseJson (Objektsender, RoutedEventArgs e) HttpClient client = new HttpClient (); Zeichenfolge result = Erwarte Client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values/1"); JObject json = JObject.Parse (Ergebnis); string value = json ["Name"]. Wert();
Das JObject
Klasse wird wie eine Sammlung behandelt, sodass Sie einfach auf eine Eigenschaft zugreifen können, indem Sie ihren Namen als Schlüssel verwenden. Am Ende können Sie den Wert mit dem Symbol extrahieren Wert
Methode, wo T
ist der Datentyp, von dem wir erwarten, dass er gespeichert wird.
Komplexes JSON
Wie C # -Objekte können JSON-Objekte auch komplexe Eigenschaften haben, wie im folgenden Beispiel gezeigt:
"Id": 1, "Name": "Matteo", "Nachname": "Pagani", "Adresse": "Straße": "Gefälschte Adresse", "Stadt": "Mailand"
Adresse
ist eine komplexe Eigenschaft, da sie andere verschachtelte Eigenschaften enthält. Um auf diese Eigenschaften zuzugreifen, müssen wir die SelectToken ()
Methode, wobei der vollständige JSON-Pfad als Parameter übergeben wird:
private async void OnParseJson (Objektsender, RoutedEventArgs e) HttpClient client = new HttpClient (); Zeichenfolge result = Erwarte Client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values/1"); JObject json = JObject.Parse (Ergebnis); string city = json.SelectToken ("Address.City"). Wert();
Mit dem Adresse.Stadt
Pfad sind wir in der Lage, den Wert der Stadt
Eigenschaft, die Teil der ist Adresse
Knoten.
JSON-Sammlungen
Wenn Sie mit JSON-Sammlungen arbeiten, können Sie die verwenden Kinder()
Methode, um Zugriff auf alle untergeordneten Knoten einer bestimmten Eigenschaft zu erhalten. Verwenden wir als Beispiel einen JSON-Code, den wir zuvor gesehen haben:
["Id": 1, "Name": "Matteo", "Nachname": "Pagani", "Id": 2, "Name": "John", "Nachname": "Doe"]
In diesem Fall können wir die verwenden JArray
Klasse und die Kinder()
Methode, um alle Elemente der Sammlung zu extrahieren. In dem folgenden Beispiel können Sie sehen, wie wir es verwenden, um eine Subcollection nur mit der Name
Eigenschaftswerte.
private async void OnGetDataClicked (Objektsender, RoutedEventArgs e) HttpClient client = new HttpClient (); Zeichenfolge result = Erwarte Client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values"); JArray json = JArray.Parse (Ergebnis); Listelist = json.Children (). Wählen Sie (x => x ["Name"].) Value ()).Auflisten();
Das HttpClient
Klasse, die wir zuvor gesehen haben, wie die WebClient
und HttpWebRequest
Klassen können nur für Vordergrundoperationen verwendet werden. Wenn die Anwendung angehalten wird, werden Netzwerkübertragungen abgebrochen.
Wenn wir uns mit großen Datenübertragungen befassen müssen, ist es nicht die beste Benutzererfahrung, wenn der Benutzer die App geöffnet hält. Für dieses Szenario wurden in Windows Phone 7.5 Hintergrundübertragungs-APIs eingeführt, mit denen ein Download- oder Uploadvorgang gestartet und fortgesetzt werden kann, auch wenn die App angehalten ist.
Es wurden jedoch einige Einschränkungen eingeführt, um Batterieprobleme und einen hohen Datenplanverbrauch zu vermeiden:
Eine Hintergrundübertragung wird durch das gekennzeichnet BackgroundTransferRequest
Klasse, die Teil der Microsoft.Phone.BackgroundTransfer
Namespace. Als Entwickler haben wir die Kontrolle über einige Bedingungen, die erfüllt sein müssen, damit eine Hintergrundübertragung, die in unserer Anwendung erstellt wurde, dank der TransferPreferences
Eigenschaft, die die folgenden Werte erhalten kann:
Keiner
, Standardwert: Die Übertragung wird nur gestartet, wenn das Telefon mit einem Wi-Fi-Netzwerk verbunden ist und der Akku aufgeladen wird.AllowBattery
: Die Übertragung wird nur gestartet, wenn das Telefon unabhängig von der Stromquelle mit einem Wi-Fi-Netzwerk verbunden ist.AllowCelullar
: Die Übertragung wird nur gestartet, wenn das Telefon aufgeladen wird, unabhängig von der Netzwerkverbindung.AllowCellularAndBattery
: Startet die Übertragung immer, unabhängig von den Anschluss- und Stromquellenbedingungen.
Das BackgroundTransferRequest
Die Klasse stellt zwei Ereignishandler bereit, die zur Steuerung der Übertragung verwendet werden können:
TransferStatusChanged
wird ausgelöst, wenn sich der Status der Übertragung ändert. Der von der Methode zurückgegebene Parameter enthält a Übermittlungsstatus
Objekt, das Sie über den aktuellen Status informiert (z. B. Abgeschlossen
wenn die Übertragung endet oder Pause
wenn die Übertragung angehalten ist). Es gibt auch bestimmte Status, die mit dem beginnen Warten
Präfix, das Ihnen mitteilt, wenn eine Übertragung aufgrund der in den definierten Bedingungen angehalten wird TransferPreferences
Eigenschaft sind nicht zufrieden. Zum Beispiel, WartenFürWiFi
wird eingestellt, wenn die Übertragung darauf wartet, dass das Telefon mit einem Wi-Fi-Netzwerk verbunden wird.TransferProgressChanged
wird ausgelöst, wenn sich der Fortschritt einer Übertragung ändert, was bedeutet, dass neue Daten heruntergeladen oder hochgeladen wurden. Normalerweise ist dieser Event-Handler mit a verbunden Fortschrittsanzeige
Steuerelement, da Eigenschaften angezeigt werden, die Sie darüber informieren, wie viele Daten übertragen wurden und wie viele Daten noch heruntergeladen oder gesendet werden müssen.Nachdem Sie eine Hintergrundübertragung definiert haben, müssen Sie sie der Warteschlange des Betriebssystems hinzufügen. Windows Phone sorgt dafür, dass es gestartet wird, wenn die angegebenen Bedingungen erfüllt sind. Um diese Aufgabe zu erfüllen, verwenden wir die BackgroundTransferService
Klasse, die der zentrale Hintergrundübertragungsmanager ist. Sie können Hintergrundübertragungen hinzufügen, entfernen oder auflisten, die zur Anwendung gehören.
Im folgenden Beispiel sehen Sie eine Hintergrundübertragungsdefinition:
private BackgroundTransferRequest backgroundRequest; private void OnStartBackgroundDownloadClicked (Objektsender, RoutedEventArgs e) Uri sourceUrl = new Uri ("http://wpsauce.com/wp-content/uploads/2011/11/windows_phone_logo.jpg"); Uri destinationUrl = neuer Uri ("/ Shared / Transfers / windows_phone_logo.jpg", UriKind.RelativeOrAbsolute); backgroundRequest = new BackgroundTransferRequest (sourceUrl, destinationUrl); backgroundRequest.TransferStatusChanged + = backgroundRequest_TransferStatusChanged; backgroundRequest.TransferPreferences = TransferPreferences.AllowCellularAndBattery; BackgroundTransferService.Add (backgroundRequest); void backgroundRequest_TransferStatusChanged (Objektsender, BackgroundTransferEventArgs e) if (backgroundRequest.TransferStatus == TransferStatus.Completed) // Die heruntergeladene Datei verwalten. BackgroundTransferService.Remove (backgroundRequest);
Wir registrieren diese Übertragung, um unabhängig von der verfügbaren Netzwerkverbindung und Stromquelle ausgeführt zu werden. Das vorherige Beispiel bezieht sich auf einen Download-Vorgang. Daher müssen wir einen Quell-URI (die herunterzuladende Datei) und einen Ziel-URI (den lokalen Speicherpfad, in dem die Datei gespeichert wird) definieren. Im Gegensatz zu dem, was wir mit gesehen haben HttpClient
, wir müssen uns nicht um den Speicherprozess kümmern; Die Datei wird automatisch heruntergeladen und im lokalen Speicher gespeichert, da der Download auch beendet werden kann, wenn die App angehalten wird. Sowohl Quell- als auch Ziel-URIs werden als Parameter von übergeben BackgroundTransferRequest
Konstrukteur.
Hinweis: Hintergrundübertragungen, die zum Ausführen von Downloadvorgängen verwendet werden, müssen die Datei immer im Pfad "Shared / Transfers" im lokalen Speicher speichern, der automatisch erstellt wird, wenn die App installiert wird. Andernfalls wird eine Ausnahme angezeigt. Wenn der Download abgeschlossen ist, können Sie die Datei bei Bedarf an eine andere Position verschieben. Sie können jedoch keine Hintergrundübertragung planen, bei der versucht wird, eine Datei in einem anderen Ordner herunterzuladen.
Als nächstes abonnieren wir die TransferStatusChanged
Veranstaltung. Wenn der Download abgeschlossen ist, während sich die App im Vordergrund befindet, können wir die heruntergeladene Datei verwalten. Wenn es sich beispielsweise um ein Bild handelt, können wir es anzeigen. Beachten Sie die Löschen()
Operation, die wir auf dem durchführen BackgroundTransferService
Klasse. Es ist sehr wichtig, diese Aufgabe immer auszuführen, da das Betriebssystem abgeschlossene Übertragungen nicht automatisch aus der Warteschlange der Anwendung entfernt. Dies kann zu unerwarteten Problemen führen, da eine Anwendung nicht mehr als 25 Übertragungen planen kann.
Wenn Sie eine Datei hochladen möchten, müssen Sie stattdessen eine BackgroundTransferRequest
Objekt auf andere Weise. Sie müssen noch zwei URIs definieren: die Quelle (die hochzuladende Datei) und das Ziel (ein Dienst, der die Datei mit dem in der Befehlsgruppe "HTTP" festgelegten Befehlssatz empfangen kann Methode
Eigentum). Der Ziel-URI kann in übergeben werden BackgroundTransferRequest
's Konstruktor (wie zuvor), aber der Quell-URI muss in der gesetzt werden UploadLocation
Eigenschaft, wie im folgenden Beispiel:
private void OnUploadFile () Uri destinationUrl = neuer Uri ("http://wp8test.azurewebsites.com/api/values", UriKind.Relative); Uri sourceUri = neuer Uri ("/ Shared / Transfers / image.png", UriKind.Relative); BackgroundTransferRequest-Anfrage = neue BackgroundTransferRequest (destinationUrl); request.UploadLocation = sourceUri; request.Method = "POST"; BackgroundTransferService.Add (Anfrage);
In diesem Artikel haben wir gesehen, wie Sie mit einer der am häufigsten verwendeten Funktionen eines Smartphones arbeiten: einer Internetverbindung. Im Detail haben wir gelernt:
HttpClient
ist eine neue Klasse, die in Windows Runtime eingeführt wurde und die Netzwerkvorgänge unterstützt. Wir haben gesehen, wie Sie damit Dateien herunterladen und hochladen und mit Diensten interagieren können.HttpClient
ist eine große Hilfe, funktioniert aber nur, wenn sich die Anwendung im Vordergrund befindet. Wenn es angehalten ist, werden Netzwerkvorgänge abgebrochen. Zu diesem Zweck bietet das Framework einige spezifische APIs, um Download- und Upload-Vorgänge auch im Hintergrund auszuführen, wenn die App nicht verwendet wird.Dieses Tutorial stellt ein Kapitel von Windows Phone 8 dar. Erfolgreich ein kostenloses eBook des Teams von Syncfusion.