Alle Windows Phone-apparaten hebben een ingebouwde netwerkverbinding, maar om dezelfde reden hebben we geleerd hoe we lokaal gegevens opslaan, we moeten klaar zijn om te beheren hoe gebruikers onze applicatie gebruiken terwijl er een verbinding ontbreekt.
Voor dit doel bevat het Windows Phone-framework een klasse die kan worden gebruikt om informatie over de opgeroepen internetverbinding te achterhalen DeviceNetworkInformation
, welke deel uitmaakt van de Microsoft.Phone.Net.NetworkInformation
namespace.
De belangrijkste is IsNetworkAvailable
, die ons vertelt of er een internetverbinding beschikbaar is. We moeten deze API altijd gebruiken voordat een bewerking wordt uitgevoerd waarvoor een verbinding is vereist, zoals het volgende voorbeeld:
private void OnCheckConnectionClicked (object afzender, RoutedEventArgs e) if (DeviceNetworkInformation.IsNetworkAvailable) MessageBox.Show ("U bent verbonden met internet"); // Voer netwerkbewerkingen uit. else MessageBox.Show ("U bent niet verbonden met internet");
De klas biedt ook een evenement aan genaamd NetworkAvailabilityChanged
die wordt geactiveerd elke keer dat de verbindingsstatus verandert. Dit is handig als u snel wilt reageren op netwerkwijzigingen, zoals het in- of uitschakelen van bepaalde toepassingsfuncties.
public MainPage () InitializeComponent (); DeviceNetworkInformation.NetworkAvailabilityChanged + = DeviceNetworkInformation_NetworkAvailabilityChanged; private void DeviceNetworkInformation_NetworkAvailabilityChanged (object afzender, NetworkNotificationEventArgs e) if (e.NotificationType == NetworkNotificationType.InterfaceDisconnected) MessageBox.Show ("Disconnected"); else if (e.NotificationType == NetworkNotificationType.InterfaceConnected) MessageBox.Show ("Connected");
De terugkeerparameters bevatten een eigenschap genaamd Notificatie type
, van het type NetworkNotificationType
, die ons de huidige netwerkstatus vertelt.
Echter, met de DeviceNetworkInformation
u kunt ook andere informatie over de huidige netwerkstatus krijgen, bijvoorbeeld of de gebruiker de mobiele gegevensverbinding heeft ingeschakeld (IsCellularDataEnabled
), de Wi-Fi-verbinding (IsWiFiEnabled
), of roaming-opties (IsCellularDataRoamingOptions
).
Het framework biedt een andere nuttige klasse om te werken met netwerkverbindingen die worden aangeroepen Netwerkinterface
. Door de NetworkInterfaceType
property, kunt u identificeren welk type verbinding momenteel wordt gebruikt. We kunnen deze eigenschap bijvoorbeeld gebruiken om te voorkomen dat u grote bestanden downloadt terwijl u een mobiele verbinding gebruikt.
NetworkInterfaceType
is een enumerator die vele waarden kan aannemen. De belangrijkste zijn:
MobileBroadbandGsm
en MobileBroadbandCdma
wanneer de telefoon is verbonden met een mobiel netwerk (GSM of CDMA, afhankelijk van het land)Wireless80211
, wanneer de telefoon is verbonden met een Wi-Fi-netwerkIn het volgende voorbeeld tonen we een bericht op het scherm met het huidige verbindingstype:
private void OnCheckConnectionTypeClicked (object afzender, RoutedEventArgs e) if (NetworkInterface.NetworkInterfaceType == NetworkInterfaceType.MobileBroadbandGsm || NetworkInterface.NetworkInterfaceType == NetworkInterfaceType.MobileBroadbandCdma) MessageBox.Show ("Mobile"); else if (NetworkInterface.NetworkInterfaceType == NetworkInterfaceType.Wireless80211) MessageBox.Show ("Wi-Fi");
Het Windows Phone-framework heeft twee ingebouwde klassen voor het uitvoeren van netwerkbewerkingen: Web cliënt
en HttpWebRequest
. Helaas is geen van beide perfect. Web cliënt
is heel gemakkelijk te gebruiken, maar het is gebaseerd op de oude callback-benadering (tenzij u de Async voor .NET pakket we eerder in deze serie besproken). HttpWebRequest
is erg krachtig, maar het is complex om te gebruiken en gebaseerd op een oud asynchroon patroon dat moeilijk te begrijpen is.
Windows Runtime heeft een nieuwe klasse geïntroduceerd genaamd HttpClient
, die het beste van beide werelden vergt. Het is krachtig en biedt geweldige prestaties, maar het is eenvoudig te gebruiken en biedt methoden die zijn gebaseerd op het nieuwe asynchroonloop- en wachtpatroon. Deze klasse is beschikbaar in de volledige Windows Runtime voor Windows Store-apps, maar deze is niet opgenomen in de Windows Phone Runtime-subset - u moet deze installeren vanaf NuGet.
De HttpClient
class, zoals we later zullen zien, is geweldig, niet alleen voor het uitvoeren van generieke netwerkbewerkingen zoals het downloaden en uploaden van bestanden, maar ook voor interactie met webservices. In feite stelt het asynchrone methoden bloot voor elke HTTP-opdracht, zoals GET, POST, PUT, enz.
Opmerking: om met het netwerk te kunnen werken, moet u de optie ID_CAP_NETWORKING in het manifestbestand inschakelen. Het is standaard ingeschakeld in elk nieuw Windows Phone-project.
Bestanden worden meestal gedownload met de opdracht GET HTTP, dus HttpClient
biedt het GetAsync ()
methode. Om het leven van ontwikkelaars eenvoudiger te maken, HttpClient
heeft enkele ingebouwde methoden om de meest voorkomende bestandstypen te downloaden, zoals GetStringAsync ()
voor het downloaden van tekstbestanden zoals XML-, RSS- of REST-antwoorden; of GetByteArrayAsync ()
en GetStreamAsync ()
om binaire bestandsinhoud te krijgen.
Het downloaden van strings is heel eenvoudig. De methode GetStringAsync ()
vereist als een parameter de URL van het bestand en retourneert de inhoud van het bestand als een tekenreeks. In het volgende voorbeeld kunt u zien hoe u de RSS-feed van mijn blog downloadt:
private async void OnDownloadStringClicked (object afzender, RoutedEventArgs e) HttpClient client = new HttpClient (); string resultaat = wacht op client.GetStringAsync ("http://feeds.feedburner.com/qmatteoq_eng");
Zodra u de reeks hebt, kunt u de vereiste bewerkingen uitvoeren volgens uw scenario. In het vorige voorbeeld had ik bijvoorbeeld de geretourneerde XML met LINQ naar XML kunnen parseren om de nieuwslijst op het scherm weer te geven.
Het downloaden van binaire bestanden kan op vele manieren worden voltooid. Je kunt gebruiken GetByteArrayAsync ()
als u liever met bytes werkt, of GetStreamAsync ()
als je de inhoud van het bestand liever als een stream manipuleert.
In het volgende voorbeeld ziet u hoe u een afbeelding kunt downloaden met behulp van de GetByteArrayAsync ()
methode. Het retourneert de array van een byte, die gemakkelijk kan worden opgeslagen in de lokale opslag met behulp van de API's die we eerder in deze serie hebben geleerd.
private async void OnDownloadFileClicked (object afzender, RoutedEventArgs e) HttpClient client = new HttpClient (); byte [] bytes = wacht op client.GetByteArrayAsync ("http://www.syncfusion.com/Content/en-US/Home/Images/syncfusion-logo.png"); StorageFile storageFile = wachten op ApplicationData.Current.LocalFolder.CreateFileAsync ("picture.png", CreationCollisionOption.ReplaceExisting); IRandomAccessStream accessStream = wachten op storageFile.OpenAsync (FileAccessMode.ReadWrite); using (IOutputStream outputStream = accessStream.GetOutputStreamAt (0)) DataWriter writer = new DataWriter (outputStream); writer.WriteBytes (bytes); wacht op writer.StoreAsync ();
Door de DataWriter
klasse, kunnen we de byte-array opslaan die is geretourneerd door de HttpClient
klasse in een bestand in de lokale opslag met de naam picture.png.
Als u volledige controle over de downloadbewerking nodig heeft, kunt u de generieke gebruiken GetAsync ()
methode, die a retourneert HttpResponseMessage
object met de volledige responsinhoud, zoals headers, statuscode, enz.
In het volgende voorbeeld kun je zien hoe, door de GetAsync ()
methode kunnen we een afbeelding downloaden als een Stroom
en toon het in een Beeld
controle geplaatst op de pagina. Aan de methode passeren we een tweede parameter van het type HttpCompletionOption
, die de klas vertelt wanneer de bewerking moet worden gemarkeerd als voltooid. Omdat we de volledige inhoud van de respons willen hebben (wat de gedownloade afbeelding is), gebruiken we de ResponseContentRead
keuze.
private async void OnDownloadStreamClicked (object afzender, RoutedEventArgs e) HttpClient client = new HttpClient (); HttpResponseMessage httpResponseMessage = wachten op client.GetAsync ("http://www.syncfusion.com/Content/en-US/Home/Images/syncfusion-logo.png", HttpCompletionOption.ResponseContentRead); Stream stream = wacht op httpResponseMessage.Content.ReadAsStreamAsync (); BitmapImage image = new BitmapImage (); image.SetSource (stroom); Logo.Bron = afbeelding;
Merk op dat de specifieke methoden die we hebben gezien aangeboden door de HttpClient
class zijn gewoon een snelkoppeling naar de methoden die worden aangeboden door de Inhoud
eigendom van de HttpResponseMessage
klasse (in de vorige steekproef gebruiken we de ReadAsStreamAsync ()
methode om de inhoud van de reactie als een antwoord te retourneren Stroom
).
Het uploaden van gegevens gebeurt op een vergelijkbare manier: de bewerking wordt meestal uitgevoerd met behulp van de opdracht POST, dus de HttpClient
klasse onthult de PostAsync ()
methode voor dit doel.
De inhoud die moet worden verzonden, wordt voorbereid met behulp van de HttpContent
klasse, die vele implementaties biedt: StreamContent
om de stream van een bestand te verzenden, ByteArrayContent
om een binair bestand te verzenden, StringContent
om een string te verzenden, of MultipartFormDataContent
om inhoud te verzenden die is gecodeerd met MIME-type met meerdere partijen / gegevensformaten.
In het volgende voorbeeld kunt u zien hoe u de stream van een bestand naar een service uploadt:
private async void OnUploadFileClicked (object afzender, RoutedEventArgs e) StorageFile storageFile = wachten op ApplicationData.Current.LocalFolder.GetFileAsync ("picture.png"); IRandomAccessStream accessStream = wachten op storageFile.OpenAsync (FileAccessMode.ReadWrite); HttpClient-client = nieuwe HttpClient (); HttpContent content = nieuwe StreamContent (accessStream.AsSstreamForRead ()); wacht op client.PostAsync ("http://wp8test.azurewebsites.net/api/values", inhoud);
Nadat we de stream van een bestand dat is opgeslagen in de lokale opslag hebben opgehaald, geven we het door aan een nieuw exemplaar van de StreamContent
klasse. Vervolgens noemen we de PostAsync ()
methode, het doorgeven van de URL van de service en de HttpContent
object als parameters.
REST (Representational State Transfer) is zonder twijfel de meest gebruikte benadering in de ontwikkeling van webdiensten, vooral in de mobiele wereld.
REST-services zijn om twee redenen erg populair geworden:
Bijna elk platform ondersteunt deze technologieën native, dus u hoeft niet te zoeken naar speciale bibliotheken om met hen te communiceren zoals nodig is voor WSDL-gebaseerde webservices.
We hebben al gezien hoe, met de HttpClient
klasse, het is eenvoudig om te communiceren met het web met behulp van de standaard HTTP-opdrachten. Meestal moet u om de REST-service te gebruiken eenvoudig het GetStringAsync ()
methode om het XML- of JSON-antwoord te krijgen.
Zodra u het resultaat hebt, moet u het meestal converteren naar objecten die in de toepassing worden gebruikt. Eerder in deze serie hebben we de eenvoudigste manier besproken om deze taak te volbrengen: deserialisatie, wat betekent dat gewone tekst wordt omgezet in complexe objecten. We kunnen de gebruiken DataContractSerializer
of DataContractJsonSerializer
klassen om dit te doen. In dit geval hoeft u alleen maar te verwijzen naar het deserialisatieproces, omdat de procedure hetzelfde is.
private async void OnConsumeServiceClicked (object afzender, RoutedEventArgs e) HttpClient client = new HttpClient (); string resultaat = wacht op client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values"); using (MemoryStream ms = nieuwe MemoryStream (Encoding.Unicode.GetBytes (result))) DataContractJsonSerializer serializer = new DataContractJsonSerializer (typeof (Lijst)); Lijst people = serializer.ReadObject (ms) als lijst ;
We nemen aan dat de service in JSON-indeling een lijst met personen retourneert:
["id": 1, "name": "Matteo", "surname": "Pagani", "id": 2, "name": "John", "surname": "Doe"]
Met de hulp van de DataContractJsonSerializer
klasse, kunnen we de vorige JSON converteren naar een lijst met Persoon
objecten, dezelfde klasse die we in veel andere voorbeelden in deze serie hebben gebruikt. Het verschil in deze steekproef is dat we het serialisatieproces kunnen regelen, in het geval dat bijvoorbeeld de eigenschapnamen die door JSON worden geretourneerd, afwijken van de namen die we in onze klassen gebruiken. Dit is een heel gebruikelijk scenario bij het omgaan met JSON, omdat eigenschapnamen meestal kleine letters zijn, terwijl ze in C # -objecten CamelCase zijn. Dit resultaat wordt bereikt door de [DataMember]
kenmerk, dat kan worden toegepast op de eigenschappen die we willen serialiseren. In het volgende voorbeeld ziet u dat het kenmerk een eigenschap aanbiedt die wordt aangeroepen Naam
, die kan worden gebruikt om op te geven welke eigenschapnaam we verwachten te vinden in het JSON-bestand.
public class Person [DataMember (Name = "id")] public int Id get; vast te stellen; [DataMember (Name = "name")] public string Naam get; vast te stellen; [DataMember (Name = "surname")] public string Achternaam get; vast te stellen;
Deze benadering heeft een nadeel: REST-services retourneren altijd een gewone reeks, terwijl de DataContractJsonSerializer
Klasse vereist een Stroom
als een invoerparameter van de ReadObject ()
methode, dus we zijn altijd gedwongen om het te converteren met een MemoryStream
voorwerp.
Er is een andere manier om hetzelfde resultaat te bereiken. Laat me JSON.NET introduceren, een externe bibliotheek die enkele extra handige functies biedt voor het verwerken van JSON-gegevens. Bovendien biedt het betere prestaties en kan het complexere JSON-bestanden deserialiseren sneller.
Het kan eenvoudig worden geïnstalleerd met behulp van NuGet en de officiële website biedt vergelijkingen met andere JSON-bibliotheken en gedetailleerde documentatie.
In het volgende voorbeeld gebruiken we JSON.NET om hetzelfde resultaat te bereiken als de code die we eerder hebben gebruikt:
private async void OnGetDataClicked (object afzender, RoutedEventArgs e) HttpClient client = new HttpClient (); string resultaat = wacht op client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values"); Lijstpeople = JsonConvert.DeserializeObject > (Resultaat);
De JsonConvert
klasse (die deel uitmaakt van de Newtonsoft.Json
naamruimte) legt het DeserializeObject
methode, waar T
is het objecttype dat we in ruil verwachten. Als invoerparameter is alleen de JSON-reeks vereist die we van de service hebben gedownload.
Het is ook mogelijk om het deserialisatieproces te beheren met behulp van attributen, zoals we eerder deden met de DataMember
attribuut. In het volgende voorbeeld kunt u zien hoe we handmatig kunnen definiëren hoe JSON-eigenschappen moeten worden vertaald:
public class Person [JsonProperty ("id")] public int Id get; vast te stellen; [JsonProperty ("name")] public string Naam get; vast te stellen; [JsonProperty ("surname")] public string Achternaam get; vast te stellen;
Tip: u zult vaak diensten van derden moeten gebruiken, zodat u niet precies weet wat de toewijzing is tussen entiteiten en JSON-gegevens. Er is een website die u in dit scenario zal helpen: http://json2csharp.com/. Plak de door uw service geretourneerde JSON en genereer voor u de benodigde C # -klassen om de JSON-gegevens in kaart te brengen.
Een ander interessant kenmerk geïntroduceerd door JSON.NET is LINQ tot JSON, een LINQ-gebaseerde taal die, vergelijkbaar met LINQ tot XML, kan worden gebruikt om een JSON-reeks te manipuleren om alleen de informatie op te halen die u nodig hebt. Deze aanpak is handig als u deserialisatie niet echt nodig hebt, maar alleen wat gegevens moet extraheren uit de JSON-reactie die u van de service hebt ontvangen.
Het startpunt om LINQ te gebruiken voor JSON is de JObject
klasse, die een JSON-bestand identificeert. Om ermee te gaan werken, hoeft u alleen maar de. Te bellen Ontleden ()
methode, waarbij de JSON-reeks als parameter wordt gebruikt, zoals in de volgende steekproef wordt getoond:
private async void OnParseJson (object afzender, RoutedEventArgs e) HttpClient client = new HttpClient (); string resultaat = wacht op client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values"); JObject json = JObject.Parse (resultaat);
Nu bent u klaar om enkele bewerkingen uit te voeren. Laten we de meest voorkomende bekijken.
Eenvoudige JSON
Hier is een voorbeeld van een eenvoudig JSON-bestand:
"Id": 1, "Name": "Matteo", "Achternaam": "Pagani"
Met LINQ tot JSON zijn we in staat om de waarde van een enkele eigenschap op de volgende manier te extraheren:
private async void OnParseJson (object afzender, RoutedEventArgs e) HttpClient client = new HttpClient (); string resultaat = wacht op client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values/1"); JObject json = JObject.Parse (resultaat); string value = json ["Name"]. Waarde();
De JObject
klasse wordt behandeld als een verzameling, dus u kunt eenvoudig toegang krijgen tot een eigenschap met de naam ervan als een sleutel. Uiteindelijk kunt u de waarde extraheren met behulp van de Waarde
methode, waar T
is het gegevenstype dat we verwachten te worden opgeslagen.
Complexe JSON
Net als C # -objecten, kunnen JSON-objecten ook complexe eigenschappen hebben, zoals weergegeven in de volgende voorbeeld:
"Id": 1, "Name": "Matteo", "Achternaam": "Pagani", "Address": "Street": "Fake address", "City": "Milan"
Adres
is een complexe eigenschap omdat deze andere geneste eigenschappen bevat. Om toegang te krijgen tot deze eigenschappen, moeten we de SelectToken ()
methode, waarbij het volledige JSON-pad als een parameter wordt doorgegeven:
private async void OnParseJson (object afzender, RoutedEventArgs e) HttpClient client = new HttpClient (); string resultaat = wacht op client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values/1"); JObject json = JObject.Parse (resultaat); string city = json.SelectToken ("Address.City"). Waarde();
Met de Adres stad
pad, kunnen we de waarde van de .extra extraheren stad
eigendom dat deel uitmaakt van de Adres
knooppunt.
JSON-verzamelingen
Wanneer u JSON-verzamelingen verwerkt, kunt u de Kinderen()
methode om toegang te krijgen tot alle kinderknooppunten van een specifieke eigenschap. Laten we als voorbeeld een JSON-code gebruiken die we eerder hebben gezien:
["Id": 1, "Name": "Matteo", "Achternaam": "Pagani", "Id": 2, "Name": "John", "Achternaam": "Doe"]
In dit geval kunnen we de JArray
klasse en de Kinderen()
methode om alle elementen van de verzameling te extraheren. In het volgende voorbeeld kun je zien hoe we het gebruiken om een subcollectie te krijgen met alleen de Naam
waarden van de eigenschap.
private async void OnGetDataClicked (object afzender, RoutedEventArgs e) HttpClient client = new HttpClient (); string resultaat = wacht op client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values"); JArray json = JArray.Parse (resultaat); Lijstlist = json.Children (). Selecteer (x => x ["Naam"]. Waarde ()) ToList ().;
De HttpClient
klas die we eerder hebben gezien, zoals de Web cliënt
en HttpWebRequest
klassen, kunnen alleen worden gebruikt voor voorgrondbewerkingen. Wanneer de toepassing is opgeschort, worden netwerkoverdrachten geannuleerd.
Wanneer we te maken hebben met grote gegevensoverdrachten, zorgt het feit dat de gebruiker wordt gedwongen de app geopend te houden niet voor de beste gebruikerservaring. Voor dit scenario heeft Windows Phone 7.5 API's voor achtergrondoverdracht geïntroduceerd die kunnen worden gebruikt om een download- of uploadbewerking te starten en door te gaan, zelfs als de app is opgeschort.
Er zijn echter enkele beperkingen die zijn ingevoerd om problemen met de batterij en het verbruik van een hoog dataplan te voorkomen:
Een achtergrondoverdracht wordt geïdentificeerd door de BackgroundTransferRequest
klasse, die deel uitmaakt van de Microsoft.Phone.BackgroundTransfer
namespace. Als ontwikkelaars hebben we controle over een aantal voorwaarden waaraan moet worden voldaan om een achtergrondoverdracht in onze applicatie te starten, dankzij de TransferPreferences
eigenschap die de volgende waarden kan krijgen:
Geen
, de standaardwaarde: de overdracht wordt alleen gestart als de telefoon is verbonden met een Wi-Fi-netwerk en de batterij wordt opgeladen.AllowBattery
: De overdracht wordt alleen gestart als de telefoon is aangesloten op een Wi-Fi-netwerk, ongeacht de voedingsbron.AllowCelullar
: De overdracht wordt alleen gestart als de telefoon wordt opgeladen, ongeacht de netwerkverbinding.AllowCellularAndBattery
: Start altijd de overdracht, ongeacht de verbindings- en voedingsbronomstandigheden.
De BackgroundTransferRequest
klasse toont twee gebeurtenishandlers die kunnen worden gebruikt om de overdracht te regelen:
TransferStatusChanged
wordt geactiveerd wanneer de status van de overdracht verandert. De parameter die door de methode wordt geretourneerd, bevat een TransferStatus
object dat u op de hoogte brengt van de huidige status (zoals Voltooid
wanneer de overdracht eindigt, of Onderbroken
wanneer de overdracht is gepauzeerd). Er zijn ook specifieke statussen die beginnen met de Aan het wachten
voorvoegsel dat aangeeft wanneer een overdracht is opgeschort omdat de voorwaarden die zijn gedefinieerd in de TransferPreferences
eigendom is niet tevreden. Bijvoorbeeld, WaitingForWiFi
wordt ingesteld wanneer de overdracht wacht totdat de telefoon wordt verbonden met een Wi-Fi-netwerk om te starten.TransferProgressChanged
wordt geactiveerd wanneer de voortgang van een overdracht verandert, wat betekent dat nieuwe gegevens zijn gedownload of geüpload. Gewoonlijk is deze gebeurtenishandler verbonden met a Voortgangsbalk
controle omdat het eigenschappen weergeeft om u te laten weten hoeveel gegevens zijn overgedragen en hoeveel gegevens nog moeten worden gedownload of verzonden.Nadat u een achtergrondoverdracht hebt gedefinieerd, moet u deze toevoegen aan de wachtrij van het besturingssysteem. Windows Phone zal ervoor zorgen dat het start wanneer aan de opgegeven voorwaarden is voldaan. Om deze taak te volbrengen, gebruiken we de BackgroundTransferService
klasse, de centrale achtergrondoverdrachtsbeheerder. U kunt achtergrondoverdrachten die bij de toepassing horen, toevoegen, verwijderen of vermelden.
In het volgende voorbeeld ziet u een definitie voor achtergrondoverdracht:
private AchtergrondTransferRequest backgroundRequest; private void OnStartBackgroundDownloadClicked (object afzender, RoutedEventArgs e) Uri sourceUrl = new 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 (object afzender, BackgroundTransferEventArgs e) if (backgroundRequest.TransferStatus == TransferStatus.Completed) // Beheer het gedownloade bestand. BackgroundTransferService.Remove (backgroundRequest);
We registreren deze overdracht om te worden uitgevoerd, ongeacht de beschikbare netwerkverbinding en stroombron. Het vorige voorbeeld is gerelateerd aan een downloadbewerking, dus we moeten een bron-URI definiëren (het bestand dat moet worden gedownload) en een bestemmings-URI (het lokale opslagpad waar het bestand wordt opgeslagen). In tegenstelling tot wat we hebben gezien HttpClient
, we hoeven niet voor het spaarproces te zorgen; het bestand wordt automatisch gedownload en opgeslagen in de lokale opslag, omdat het downloaden ook kan worden voltooid wanneer de app is opgeschort. Zowel bron- als doel-URI's worden doorgegeven als parameters van de BackgroundTransferRequest
bouwer.
Opmerking: achtergrondoverdrachten die worden gebruikt om downloadbewerkingen uit te voeren, moeten altijd het bestand opslaan in het pad Gedeelde / Overdrachten in de lokale opslag, dat automatisch wordt gemaakt wanneer de app wordt geïnstalleerd, anders krijgt u een uitzondering. Wanneer het downloaden is voltooid, kunt u het bestand desgewenst naar een andere positie verplaatsen, maar u kunt geen achtergrondoverdracht plannen die probeert een bestand in een andere map te downloaden..
Vervolgens abonneren we ons op de TransferStatusChanged
evenement. Als de download is voltooid terwijl de app op de voorgrond staat, kunnen we het gedownloade bestand beheren. Als het bijvoorbeeld een afbeelding is, kunnen we deze weergeven. Let op de Verwijderen()
bewerking die we uitvoeren op de BackgroundTransferService
klasse. Het is erg belangrijk om deze taak altijd uit te voeren, omdat het besturingssysteem niet automatisch voltooide overdrachten uit de wachtrij van de toepassing verwijdert en dit kan leiden tot onverwachte problemen, omdat een toepassing niet meer dan 25 overdrachten kan plannen..
In plaats daarvan moet u een bestand maken als u een bestand wilt uploaden BackgroundTransferRequest
object op een andere manier. U moet nog steeds twee URI's definiëren: de bron (het bestand dat moet worden geüpload) en de bestemming (een service die het bestand kan ontvangen met behulp van de HTTP-opdracht die is ingesteld in de Methode
eigendom). De bestemmings-URI kan worden doorgegeven in de BackgroundTransferRequest
's constructor (zoals we eerder deden), maar de source URI moet worden ingesteld in de UploadLocation
eigendom, zoals in het volgende voorbeeld:
private void OnUploadFile () Uri destinationUrl = new Uri ("http://wp8test.azurewebsites.com/api/values", UriKind.Relative); Uri sourceUri = new Uri ("/ Shared / Transfers / image.png", UriKind.Relative); BackgroundTransferRequest request = new BackgroundTransferRequest (destinationUrl); request.UploadLocation = sourceUri; request.Method = "POST"; BackgroundTransferService.Add (verzoek);
In dit artikel hebben we gezien hoe je kunt werken met een van de meest gebruikte functies van een smartphone: een internetverbinding. In detail hebben we geleerd:
HttpClient
is een nieuwe klasse geïntroduceerd in Windows Runtime die helpt netwerkbewerkingen uit te voeren. We hebben gezien hoe het te gebruiken om bestanden te downloaden en te uploaden en om met services te communiceren.HttpClient
is een grote hulp, maar het werkt alleen als de toepassing op de voorgrond staat. Wanneer deze is opgeschort, worden netwerkbewerkingen geannuleerd. Voor dit doel biedt het framework een aantal specifieke API's om download- en uploadbewerkingen uit te voeren, zelfs op de achtergrond wanneer de app niet in gebruik is.Deze tutorial staat voor een hoofdstuk uit Windows Phone 8 Shortlyly, een gratis eBoek van het team van Syncfusion.