Windows Phone 8 Kurz gesagt Data Access-Network

Überprüfen der Internetverbindung

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 ist

Im 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"); 

Durchführen von Netzwerkvorgängen: HttpClient

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.

Daten herunterladen

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).

Daten hochladen

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-Dienste verwenden

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:

  • Sie basieren auf dem HTTP-Protokoll und machen Vorgänge mit den Standard-HTTP-Befehlen (wie GET, POST, PUT usw.) verfügbar..
  • Sie geben Daten unter Verwendung von Standardsprachen wie XML und JSON zurück.

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"); Liste people = 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. 

LINQ zu JSON

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); Liste list = json.Children (). Wählen Sie (x => x ["Name"].) Value()).Auflisten(); 

Hintergrundübertragungen

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:

  • Wenn das Telefon mit einem Mobilfunknetz verbunden ist, können Dateien mit mehr als 20 MB nicht heruntergeladen werden.
  • Wenn das Telefon mit einem Wi-Fi-Netzwerk verbunden ist, können Dateien mit mehr als 100 MB nicht heruntergeladen werden.
  • Das 100-MB-Limit kann nur überschritten werden, wenn das Telefon an ein WLAN-Netzwerk angeschlossen ist und der Akku aufgeladen wird.
  • Eine einzelne Anwendung kann bis zu 25 Hintergrundübertragungsvorgänge in eine Warteschlange stellen.
  • Die Warteschlange des globalen Betriebssystems kann bis zu 500 Hintergrundübertragungsvorgänge enthalten.
  • Das Telefon kann maximal zwei Übertragungsvorgänge gleichzeitig ausführen.

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); 

Fazit

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:

  • Selbst wenn eine Internetverbindung für jedes Gerät ein Muss ist, sollten wir wissen, dass Benutzer manchmal keine Verbindung haben. Es ist wichtig, vor einem Netzwerkbetrieb sorgfältig zu prüfen, ob das Telefon mit dem Internet verbunden ist.
  • 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.
  • Das Herunterladen und Hochladen von Dateien ist eine übliche Aufgabe, aber heutzutage müssen immer mehr Anwendungen mit Web-Services interagieren, um die benötigten Daten zu erhalten. In diesem Artikel haben wir erfahren, wie es dank der JSON.NET-Bibliothek einfach ist, mit REST-Services zu arbeiten und JSON-Daten in C # -Objekte zu konvertieren.
  • 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.