Windows Phone 8 succinctement Data Access-Network

Vérification de la connexion Internet

Tous les appareils Windows Phone ont une connexion réseau intégrée, mais pour la même raison, nous avons appris à stocker localement les données. Nous devons être prêts à gérer la manière dont les utilisateurs utilisent notre application lorsqu'une connexion est manquante..

À cette fin, la structure Windows Phone comprend une classe permettant de découvrir des informations sur la connexion Internet, appelées DeviceNetworkInformation, qui fait partie de la Microsoft.Phone.Net.NetworkInformation espace de noms.

Le plus important est IsNetworkAvailable, qui nous indique si une connexion Internet est disponible. Nous devrions toujours utiliser cette API avant d'effectuer une opération nécessitant une connexion, comme dans l'exemple suivant:

Void privé OnCheckConnectionClicked (expéditeur de l'objet, RoutedEventArgs e) if (DeviceNetworkInformation.IsNetworkAvailable) MessageBox.Show ("Vous êtes connecté à Internet"); // Effectuer des opérations sur le réseau.  else MessageBox.Show ("Vous n'êtes pas connecté à Internet"); 

La classe propose également un événement appelé NetworkAvailabilityChanged qui est déclenché à chaque changement d'état de la connexion. C'est utile si vous souhaitez réagir rapidement aux modifications du réseau, telles que l'activation ou la désactivation de certaines fonctionnalités de l'application..

public MainPage () InitializeComponent (); DeviceNetworkInformation.NetworkAvailabilityChanged + = DeviceNetworkInformation_NetworkAvailabilityChanged;  void privé DeviceNetworkInformation_NetworkAvailabilityChanged (expéditeur de l'objet, NetworkNotificationEventArgs e) if (e.NotificationType == NetworkNotificationType.InterfaceDisconnected) MessageBox.Show ("Disconnected");  else if (e.NotificationType == NetworkNotificationType.InterfaceConnected) MessageBox.Show ("Connected"); 

Les paramètres de retour contiennent une propriété appelée Type de notification, du type NetworkNotificationType, qui nous dit l'état actuel du réseau.

Cependant, avec le DeviceNetworkInformation vous pourrez également obtenir d'autres informations sur l'état actuel du réseau, par exemple si l'utilisateur a activé la connexion de données cellulaires (IsCellularDataEnabled), la connexion Wi-Fi (IsWiFiEnabled), ou des options d'itinérance (IsCellularDataRoamingOptions).

Le cadre offre une autre classe utile pour traiter les connexions réseau appelée Interface réseau. En utilisant le NetworkInterfaceType propriété, vous pourrez identifier le type de connexion actuellement utilisé. Par exemple, nous pouvons utiliser cette propriété pour éviter de télécharger de gros fichiers en utilisant une connexion cellulaire.

NetworkInterfaceType est un énumérateur qui peut assumer de nombreuses valeurs. Les plus importants sont:

  • MobileBroadbandGsm et MobileBroadbandCdma lorsque le téléphone est connecté à un réseau cellulaire (GSM ou CDMA, selon le pays)
  • Sans fil80211, lorsque le téléphone est connecté à un réseau Wi-Fi

Dans l'exemple suivant, nous affichons un message à l'écran avec le type de connexion actuel:

void privé OnCheckConnectionTypeClicked (expéditeur d'objet, RoutedEventArgs e) if (NetworkInterface.NetworkInterfaceType == NetworkInterfaceType.MobileBroadbandGsm || NetworkInterface.NetworkInterfaceType == NetworkInterfaceType.MobileBroadbandCdma) MessageBox.Amis  else if (NetworkInterface.NetworkInterfaceType == NetworkInterfaceType.Wireless80211) MessageBox.Show ("Wi-Fi"); 

Effectuer des opérations réseau: HttpClient

La structure Windows Phone comporte deux classes intégrées pour effectuer des opérations sur le réseau: WebClient et HttpWebRequest. Malheureusement, aucun d'eux n'est parfait. WebClient est très facile à utiliser, mais il est basé sur l’ancienne approche de rappel (à moins d’installer le Async pour .NET paquet dont nous avons discuté plus tôt dans cette série). HttpWebRequest est très puissant, mais complexe à utiliser et basé sur un vieux modèle asynchrone difficile à comprendre.

Windows Runtime a introduit une nouvelle classe appelée HttpClient, qui prend le meilleur des deux mondes. Il est puissant et offre d'excellentes performances, mais il est facile à utiliser et propose des méthodes basées sur le nouveau modèle asynchrone et en attente. Cette classe est disponible dans la totalité des applications Windows Runtime pour Windows Store, mais elle n'est pas incluse dans le sous-ensemble Windows Phone Runtime. Vous devrez l'installer à partir de NuGet..

le HttpClient Comme nous le verrons plus tard, class est idéal non seulement pour effectuer des opérations réseau génériques telles que le téléchargement et le téléchargement de fichiers, mais également pour interagir avec des services Web. En fait, il expose des méthodes asynchrones pour chaque commande HTTP, comme GET, POST, PUT, etc..

Remarque: pour pouvoir interagir avec le réseau, vous devez activer l'option ID_CAP_NETWORKING dans le fichier manifeste. Il est activé par défaut dans chaque nouveau projet Windows Phone.

Téléchargement de données

Les fichiers sont généralement téléchargés à l’aide de la commande GET HTTP. HttpClient offre le GetAsync () méthode. Pour simplifier la vie des développeurs, HttpClient possède des méthodes intégrées pour télécharger les types de fichiers les plus courants, tels que GetStringAsync () pour télécharger des fichiers texte tels que des réponses XML, RSS ou REST; ou GetByteArrayAsync () et GetStreamAsync () obtenir le contenu d'un fichier binaire.

Télécharger des chaînes est vraiment facile. La méthode GetStringAsync () requiert comme paramètre l'URL du fichier et renvoie le contenu du fichier sous forme de chaîne. Dans l'exemple suivant, vous pouvez voir comment télécharger le flux RSS de mon blog:

void asynchrone privé OnDownloadStringClicked (expéditeur d'objet, RoutedEventArgs e) client HttpClient = new HttpClient (); string result = wait client.GetStringAsync ("http://feeds.feedburner.com/qmatteoq_eng"); 

Une fois que vous avez la chaîne, vous pouvez effectuer les opérations requises en fonction de votre scénario. Par exemple, dans l'exemple précédent, j'aurais pu analyser le XML renvoyé avec LINQ to XML pour afficher la liste des nouvelles à l'écran..

Le téléchargement de fichiers binaires peut être accompli de plusieurs manières. Vous pouvez utiliser GetByteArrayAsync () si vous préférez travailler avec des octets, ou GetStreamAsync () si vous préférez manipuler le contenu du fichier sous forme de flux.

Dans l'exemple suivant, vous verrez comment télécharger une image à l'aide de la GetByteArrayAsync () méthode. Il retourne un tableau d'octets, qui peut être facilement sauvegardé dans le stockage local à l'aide des API que nous avons apprises précédemment dans cette série..

void async privé OnDownloadFileClicked (expéditeur d'objet, RoutedEventArgs e) client HttpClient = new HttpClient (); byte [] bytes = wait client.GetByteArrayAsync ("http://www.syncfusion.com/Content/en-US/Home/Images/syncfusion-logo.png"); StorageFile storageFile = wait ApplicationData.Current.LocalFolder.CreateFileAsync ("picture.png", CreationCollisionOption.ReplaceExisting); IRandomAccessStream accessStream = wait storageFile.OpenAsync (FileAccessMode.ReadWrite); using (IOutputStream outputStream = accessStream.GetOutputStreamAt (0)) DataWriter writer = new DataWriter (outputStream); writer.WriteBytes (octets); attendez writer.StoreAsync (); 

En utilisant le DataWriter classe, nous sommes en mesure de sauvegarder le tableau d'octets renvoyé par le HttpClient class dans un fichier dans le stockage local appelé picture.png.

Si vous avez besoin d’un contrôle total sur l’opération de téléchargement, vous pouvez utiliser le programme générique. GetAsync () méthode, qui retourne un HttpResponseMessage objet avec le contenu entier de la réponse, comme les en-têtes, le code d'état, etc..

Dans l'exemple suivant, vous pouvez voir comment, en utilisant le GetAsync () méthode, nous sommes en mesure de télécharger une image en tant que Courant et l'afficher dans un Image contrôle placé sur la page. A la méthode on passe un second paramètre de type HttpCompletionOption, qui indique à la classe quand marquer l'opération comme terminée. Puisque nous voulons le contenu complet de la réponse (l’image téléchargée), nous utilisons le ResponseContentRead option.

void asynchrone privé OnDownloadStreamClicked (expéditeur d'objet, RoutedEventArgs e) client HttpClient = new HttpClient (); HttpResponseMessage httpResponseMessage = wait client.GetAsync ("http://www.syncfusion.com/Content/en-US/Home/Images/syncfusion-logo.png", HttpCompletionOption.ResponseContentContentRead); Stream stream = attendez httpResponseMessage.Content.ReadAsStreamAsync (); BitmapImage image = new BitmapImage (); image.SetSource (flux); Logo.Source = image; 

Notez que les méthodes spécifiques proposées par le HttpClient classe sont simplement un raccourci vers les méthodes offertes par le Contenu propriété du HttpResponseMessage classe (dans l'exemple précédent, nous utilisons le ReadAsStreamAsync () méthode pour retourner le contenu de la réponse en tant que Courant).

Téléchargement de données

Le téléchargement des données s’effectue de la même manière: l’opération est généralement effectuée à l’aide de la commande POST, de sorte que la HttpClient la classe expose le PostAsync () méthode à cette fin.

Le contenu à envoyer est préparé à l'aide du HttpContent classe, qui offre de nombreuses implémentations: StreamContent envoyer le flux d'un fichier, ByteArrayContent envoyer un fichier binaire, StringContent envoyer une chaîne, ou MultipartFormDataContent envoyer du contenu codé en utilisant le type MIME multipart / form-data.

Dans l'exemple suivant, vous pouvez voir comment télécharger le flux d'un fichier vers un service:

async void privé OnUploadFileClicked (expéditeur d'objet, RoutedEventArgs e) StorageFile storageFile = wait ApplicationData.Current.LocalFolder.GetFileAsync ("picture.png"); IRandomAccessStream accessStream = wait storageFile.OpenAsync (FileAccessMode.ReadWrite); Client HttpClient = new HttpClient (); HttpContent content = new StreamContent (accessStream.AsStreamForRead ()); wait client.PostAsync ("http://wp8test.azurewebsites.net/api/values", contenu); 

Après avoir récupéré le flux d’un fichier stocké dans le stockage local, nous le transmettons à une nouvelle instance du fichier. StreamContent classe. Ensuite, nous appelons le PostAsync () méthode, en passant l'URL du service et le HttpContent objet comme paramètres.

Utilisation des services REST

REST (Representational State Transfer) est sans aucun doute l'approche la plus utilisée de nos jours dans le développement de services Web, en particulier dans le monde mobile..

Les services REST sont devenus très populaires pour deux raisons:

  • Ils sont basés sur le protocole HTTP et exposent les opérations à l'aide des commandes HTTP standard (telles que GET, POST, PUT, etc.)..
  • Ils renvoient des données en utilisant des langages standard tels que XML et JSON..

Presque toutes les plates-formes supportent nativement ces technologies, vous n’avez donc pas besoin de rechercher des bibliothèques spéciales pour interagir avec celles-ci, contrairement aux services Web WSDL..

Nous avons déjà vu comment, avec le HttpClient classe, c’est simple d’interagir avec le Web à l’aide des commandes HTTP standard. La plupart du temps, pour interagir avec un service REST, vous devez simplement exécuter le GetStringAsync () méthode pour obtenir la réponse XML ou JSON.

Une fois que vous avez obtenu le résultat, vous devrez la plupart du temps le convertir en objets à utiliser dans l'application. Plus tôt dans cette série, nous avons discuté de la manière la plus simple d'accomplir cette tâche: la désérialisation, ce qui signifie la traduction de texte brut en objets complexes. Nous pouvons utiliser le DataContractSerializer ou DataContractJsonSerializer classes pour le faire. Dans ce cas, il vous suffit de vous référer au processus de désérialisation car la procédure est la même..

async privé void OnConsumeServiceClicked (expéditeur d'objet, RoutedEventArgs e) client HttpClient = new HttpClient (); string result = wait client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values"); using (MemoryStream ms = new MemoryStream (Encoding.Unicode.GetBytes (result)))) DataContractJsonSerializer serializer = new DataContractJsonSerializer (typeof (List)); liste people = serializer.ReadObject (ms) en tant que liste; 

Nous supposons que le service renvoie, au format JSON, une liste de personnes:

["id": 1, "nom": "Matteo", "nom de famille": "Pagani", "id": 2, "nom": "Jean", "nom de famille:" Doe "]

Avec l'aide du DataContractJsonSerializer classe, nous sommes en mesure de convertir le JSON précédent en une liste de La personne objets, qui est la même classe que nous avons utilisée dans de nombreux autres échantillons de cette série. La différence dans cet exemple réside dans le fait que nous sommes en mesure de contrôler le processus de sérialisation, au cas où, par exemple, les noms de propriété renvoyés par le JSON seraient différents de ceux que nous utilisons dans nos classes. Il s'agit d'un scénario très courant lorsque vous utilisez JSON, car les noms de propriété sont généralement en minuscule, alors que dans les objets C #, ils sont CamelCase. Ce résultat est obtenu en utilisant le [DataMember] attribut, qui peut être appliqué aux propriétés que nous voulons sérialiser. Dans l'exemple suivant, vous pouvez voir que l'attribut offre une propriété appelée prénom, qui peut être utilisé pour spécifier quel nom de propriété nous nous attendons à trouver dans le fichier JSON.

Classe publique Person [DataMember (Name = "id")] public int Id get; ensemble;  [DataMember (Name = "name")] chaîne publique Name get; ensemble;  [DataMember (Name = "nom de famille")] chaîne publique Nom de famille get; ensemble; 

Cette approche a un inconvénient: les services REST renvoient toujours une chaîne simple, tandis que le DataContractJsonSerializer la classe nécessite un Courant en tant que paramètre d'entrée du ReadObject () méthode, donc nous sommes toujours obligés de le convertir en utilisant un MemoryStream objet.

Il y a une autre façon d'atteindre le même résultat. Permettez-moi de vous présenter JSON.NET, une bibliothèque tierce qui offre des fonctionnalités supplémentaires utiles pour la gestion des données JSON. De plus, il offre de meilleures performances et est capable de désérialiser plus rapidement des fichiers JSON complexes..

Il peut être facilement installé à l’aide de NuGet. Son site Web officiel offre des comparaisons avec d’autres bibliothèques JSON et une documentation détaillée..

Dans l'exemple suivant, nous utilisons JSON.NET pour obtenir le même résultat que le code que nous avons précédemment utilisé:

void async privé OnGetDataClicked (expéditeur d'objet, RoutedEventArgs e) client HttpClient = new HttpClient (); string result = wait client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values"); liste people = JsonConvert.DeserializeObject> (résultat); 

le JsonConvert classe (qui fait partie de la Newtonsoft.Json espace de noms) expose le DeserializeObject() méthode, où T est le type d'objet que nous attendons en retour. En tant que paramètre d'entrée, il ne nécessite que la chaîne JSON que nous avons téléchargée à partir du service..

Il est également possible de contrôler le processus de désérialisation en utilisant des attributs, comme nous l’avions déjà fait avec le DataMember attribut. Dans l'exemple suivant, vous pouvez voir comment nous pouvons définir manuellement la traduction des propriétés JSON:

Classe publique Person [JsonProperty ("id")] public int Id get; ensemble;  [JsonProperty ("name")] chaîne publique Name get; ensemble;  [JsonProperty ("nom de famille")] chaîne publique Nom de famille get; ensemble; 

Conseil: Vous devrez souvent utiliser des services tiers pour ne pas connaître le mappage exact entre les entités et les données JSON. Il existe un site Web qui vous aidera dans ce scénario: http://json2csharp.com/. Il vous suffit de coller le JSON renvoyé par votre service, qui générera pour vous les classes C # nécessaires pour mapper les données JSON.. 

LINQ to JSON

Une autre fonctionnalité intéressante introduite par JSON.NET est LINQ to JSON, un langage basé sur LINQ qui, similaire à LINQ to XML, peut être utilisé pour manipuler une chaîne JSON afin d'extraire uniquement les informations dont vous avez besoin. Cette approche est utile lorsque vous n'avez pas vraiment besoin d'utiliser la désérialisation, mais que vous devez simplement extraire certaines données de la réponse JSON que vous avez reçue du service..

Le point de départ pour utiliser LINQ to JSON est le JObject classe, qui identifie un fichier JSON. Pour commencer à travailler avec, il vous suffit d'appeler le Parse () méthode, en transmettant en tant que paramètre la chaîne JSON, comme indiqué dans l'exemple suivant:

void asynchrone privé OnParseJson (expéditeur d'objet, RoutedEventArgs e) client HttpClient = new HttpClient (); string result = wait client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values"); JObject json = JObject.Parse (résultat); 

Vous êtes maintenant prêt à exécuter certaines opérations. Jetons un coup d'oeil aux plus communs.

JSON simple

Voici un exemple de fichier JSON simple:

"Id": 1, "Nom": "Matteo", "Nom de famille": "Pagani"

Avec LINQ to JSON, nous pouvons extraire la valeur d'une propriété unique de la manière suivante:

void asynchrone privé OnParseJson (expéditeur d'objet, RoutedEventArgs e) client HttpClient = new HttpClient (); string result = wait client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values/1"); JObject json = JObject.Parse (résultat); valeur de chaîne = json ["Nom"]. Valeur(); 

le JObject class est traité comme une collection, vous pouvez donc simplement accéder à une propriété en utilisant son nom en tant que clé. En fin de compte, vous pouvez extraire la valeur en utilisant le Valeur() méthode, où T est le type de données que nous espérons stocker.

JSON complexe

Comme les objets C #, les objets JSON peuvent également avoir des propriétés complexes, comme illustré dans l'exemple suivant:

"Id": 1, "Nom": "Matteo", "Nom de famille": "Pagani", "Adresse": "Rue": "Fausse adresse", "Ville": "Milan"

Adresse est une propriété complexe car elle contient d'autres propriétés imbriquées. Pour accéder à ces propriétés, nous devons utiliser le SelectToken () méthode, en passant le chemin JSON complet en tant que paramètre:

void asynchrone privé OnParseJson (expéditeur d'objet, RoutedEventArgs e) client HttpClient = new HttpClient (); string result = wait client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values/1"); JObject json = JObject.Parse (résultat); string city = json.SelectToken ("Address.City"). Valeur(); 

Avec le L'addresse de la ville chemin, nous sommes en mesure d'extraire la valeur de la Ville propriété qui fait partie de la Adresse nœud.

Collections JSON

Lorsque vous manipulez des collections JSON, vous pouvez utiliser le Enfants () méthode pour accéder à tous les nœuds enfants d’une propriété spécifique. Prenons, à titre d'exemple, un code JSON que nous avons vu précédemment:

["Id": 1, "Nom": "Matteo", "Nom de famille": "Pagani", "Id": 2, "Nom": "Jean", "Nom de famille": "Doe"]

Dans ce cas, nous pouvons utiliser le JArray la classe et la Enfants () méthode pour extraire tous les éléments de la collection. Dans l'exemple suivant, vous pouvez voir comment nous l'utilisons pour obtenir une sous-collection avec uniquement le prénom valeurs de la propriété.

void async privé OnGetDataClicked (expéditeur d'objet, RoutedEventArgs e) client HttpClient = new HttpClient (); string result = wait client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values"); JArray json = JArray.Parse (result); liste list = json.Children (). Sélectionnez (x => x ["Nom"].) Valeur()).Lister(); 

Transferts de fond

le HttpClient classe que nous avons déjà vu, comme le WebClient et HttpWebRequest classes, ne peut être utilisé que pour les opérations de premier plan. Lorsque l'application est suspendue, les transferts réseau sont annulés.

Lorsque nous devons faire face à des transferts Big Data, obliger l'utilisateur à garder l'application ouverte ne crée pas la meilleure expérience utilisateur. Pour ce scénario, Windows Phone 7.5 a introduit des API de transfert en arrière-plan pouvant être utilisées pour démarrer une opération de téléchargement ou une opération de téléchargement et la poursuivre même si l'application est suspendue..

Toutefois, certaines limitations ont été introduites pour éviter les problèmes de batterie et une consommation de plan de données élevée:

  • Si le téléphone est connecté à un réseau cellulaire, les fichiers de plus de 20 Mo ne peuvent pas être téléchargés..
  • Si le téléphone est connecté à un réseau Wi-Fi, les fichiers de plus de 100 Mo ne peuvent pas être téléchargés..
  • La limite de 100 Mo ne peut être dépassée que si le téléphone est connecté à un réseau Wi-Fi et que la batterie est en cours de chargement..
  • Une seule application peut mettre en file d'attente jusqu'à 25 opérations de transfert en arrière-plan.
  • La file d'attente du système d'exploitation global peut contenir jusqu'à 500 opérations de transfert en arrière-plan..
  • Le téléphone peut exécuter un maximum de deux opérations de transfert à la fois..

Un transfert en arrière-plan est identifié par le BackgroundTransferRequest classe, qui fait partie de la Microsoft.Phone.BackgroundTransfer espace de noms. En tant que développeurs, nous contrôlons certaines conditions à remplir pour qu'un transfert en arrière-plan créé dans notre application puisse démarrer, grâce à la TransferPreferences propriété pouvant obtenir les valeurs suivantes:

  • Aucun, la valeur par défaut: le transfert ne commence que si le téléphone est connecté à un réseau Wi-Fi et que la batterie est en cours de chargement.
  • AllowBattery: Le transfert ne commence que si le téléphone est connecté à un réseau Wi ‑ Fi, quelle que soit la source d'alimentation.
  • AllowCelullar: Le transfert est démarré uniquement si le téléphone est en cours de chargement, quelle que soit la connexion réseau.

AllowCellularAndBattery: Commence toujours le transfert, quelles que soient la connexion et les conditions de la source d'alimentation.

le BackgroundTransferRequest La classe expose deux gestionnaires d’événements pouvant être utilisés pour contrôler le transfert:

  • TransferStatusChanged est déclenché lorsque le statut du transfert change. Le paramètre renvoyé par la méthode contient un Statut de transfert objet qui vous informe de l'état actuel (comme Terminé quand le transfert se termine, ou En pause lorsque le transfert est en pause). Il existe également des statuts spécifiques qui commencent par le Attendre préfixe qui vous indique quand un transfert est suspendu parce que les conditions définies dans le TransferPreferences la propriété ne sont pas satisfaits. Par exemple, WaitingForWiFi est défini lorsque le transfert attend que le téléphone soit connecté à un réseau Wi-Fi pour démarrer.
  • TransferProgressChanged est déclenché lorsque la progression d'un transfert change, ce qui signifie que de nouvelles données ont été téléchargées ou téléchargées. Généralement, ce gestionnaire d’événements est connecté à un Barre de progression contrôle car il expose des propriétés pour vous informer de la quantité de données transférée et de la quantité de données restant à télécharger ou à envoyer.

Une fois que vous avez défini un transfert en arrière-plan, vous devez l'ajouter à la file d'attente du système d'exploitation. Windows Phone se chargera de le démarrer lorsque les conditions spécifiées seront remplies. Pour accomplir cette tâche, nous utilisons le BackgroundTransferService classe, qui est le gestionnaire de transfert en arrière-plan central. Vous pouvez ajouter, supprimer ou répertorier les transferts en arrière-plan appartenant à l'application..

Dans l'exemple suivant, vous pouvez voir une définition de transfert en arrière-plan:

private BackgroundTransferRequest backgroundRequest; void privé OnStartBackgroundDownloadClicked (expéditeur d'objet, RoutedEventArgs e) Uri sourceUrl = nouvel Uri ("http://wpsauce.com/wp-content/uploads/2011/11/windows_phone_logo.jpg"); Uri destinationUrl = new 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 (expéditeur d'objet, BackgroundTransferEventArgs e) if (backgroundRequest.TransferStatus == TransferStatus.Completed) // Gère le fichier téléchargé. BackgroundTransferService.Remove (backgroundRequest); 

Nous enregistrons ce transfert à exécuter indépendamment des connexions réseau disponibles et de la source d'alimentation. L'exemple précédent étant lié à une opération de téléchargement, il est donc nécessaire de définir un URI source (le fichier à télécharger) et un URI de destination (le chemin de stockage local dans lequel le fichier sera enregistré). Contrairement à ce que nous avons vu avec HttpClient, nous n'avons pas à prendre en charge le processus de sauvegarde; le fichier sera automatiquement téléchargé et enregistré dans la mémoire de stockage locale car le téléchargement peut également se terminer lorsque l'application est suspendue. Les adresses URI source et cible sont transmises en tant que paramètres du BackgroundTransferRequest constructeur.

Remarque: les transferts en arrière-plan utilisés pour effectuer des opérations de téléchargement doivent toujours enregistrer le fichier dans le chemin d'accès Partagé / Transfers du stockage local, qui est automatiquement créé lors de l'installation de l'application. Sinon, vous obtiendrez une exception. Une fois le téléchargement terminé, vous êtes libre de déplacer le fichier vers un autre emplacement si nécessaire, mais vous ne pouvez pas planifier un transfert en arrière-plan qui tente de télécharger un fichier dans un autre dossier..

Ensuite, nous nous abonnons à la TransferStatusChanged un événement. Si le téléchargement est terminé alors que l'application est au premier plan, nous pouvons gérer le fichier téléchargé. Par exemple, si c'est une image, nous pouvons l'afficher. Remarquez le Retirer() opération que nous effectuons sur le BackgroundTransferService classe. Il est très important de toujours effectuer cette tâche car le système d'exploitation ne supprimera pas automatiquement les transferts terminés de la file d'attente de l'application et cela peut entraîner des problèmes inattendus puisqu'un logiciel ne peut pas planifier plus de 25 transferts..

Au lieu de cela, si vous devez télécharger un fichier, vous devez créer un fichier. BackgroundTransferRequest objet d'une manière différente. Vous devez toujours définir deux URI: la source (le fichier à télécharger) et la destination (un service capable de recevoir le fichier à l'aide de la commande HTTP définie dans la commande Méthode propriété). L’URI de destination peut être passé dans le BackgroundTransferRequestLe constructeur de (comme nous l'avons fait précédemment), mais l'URI source doit être défini dans le UploadLocation propriété, comme dans l'exemple suivant:

void privé OnUploadFile () Uri destinationUrl = nouvel Uri ("http://wp8test.azurewebsites.com/api/values", UriKind.Relative); Uri sourceUri = new Uri ("/ Shared / Transfers / image.png", UriKind.Relative); Demande BackgroundTransferRequest = new BackgroundTransferRequest (destinationUrl); request.UploadLocation = sourceUri; request.Method = "POST"; BackgroundTransferService.Add (demande); 

Conclusion

Dans cet article, nous avons vu comment utiliser l'une des fonctionnalités les plus utilisées d'un smartphone: une connexion Internet. En détail, nous avons appris:

  • Même si une connexion Internet est indispensable pour chaque appareil, sachez que, parfois, les utilisateurs peuvent ne pas avoir de connexion disponible. Il est important de vérifier si le téléphone est connecté à Internet avant de commencer à utiliser le réseau..
  • HttpClient est une nouvelle classe introduite dans Windows Runtime qui permet d'effectuer des opérations sur le réseau. Nous avons vu comment l'utiliser pour télécharger et télécharger des fichiers et pour interagir avec des services..
  • Le téléchargement et le téléchargement de fichiers est une tâche courante, mais de plus en plus d'applications doivent interagir avec des services Web pour obtenir les données dont elles ont besoin. Dans cet article, nous avons appris comment, grâce à la bibliothèque JSON.NET, il est facile de travailler avec des services REST et de convertir des données JSON en objets C #..
  • HttpClient est une aide précieuse, mais elle ne fonctionne que si l’application est au premier plan. Lorsqu'il est suspendu, les opérations du réseau sont annulées. À cette fin, la structure offre des API spécifiques pour effectuer des opérations de téléchargement et de téléchargement même en arrière-plan lorsque l'application n'est pas utilisée..

Ce tutoriel représente un chapitre de Windows Phone 8 Succinctly, un eBook gratuit de l’équipe de Syncfusion.