Windows Phone 8 Succinctly Data Access-Network

Kontrollerer Internett-tilkoblingen

Alle Windows Phone-enheter har en innebygd nettverksforbindelse, men av samme grunn lærte vi å lagre data lokalt, vi må være klare til å administrere hvordan brukerne bruker programmet, mens en tilkobling mangler.

I dette formålet inneholder Windows Phone-rammeverket en klasse som kan brukes til å oppdage informasjon om den kalt Internett-tilkoblingen DeviceNetworkInformation, som er en del av Microsoft.Phone.Net.NetworkInformation namespace.

Den viktigste er IsNetworkAvailable, som forteller oss om en Internett-tilkobling er tilgjengelig. Vi bør alltid bruke denne API-en før du utfører en operasjon som krever en tilkobling, som følgende eksempel:

privat ugyldig OnCheckConnectionClicked (objekt sender, RoutedEventArgs e) if (DeviceNetworkInformation.IsNetworkAvailable) MessageBox.Show ("Du er koblet til Internett"); // Utfør nettverksoperasjoner.  else MessageBox.Show ("Du er ikke koblet til Internett"); 

Klassen tilbyr også en hendelse som heter NetworkAvailabilityChanged som utløses hver gang forbindelsesstatusen endres. Det er nyttig hvis du raskt vil reagere på nettverksendringer, for eksempel aktivering eller deaktivering av visse programfunksjoner.

offentlig MainPage () InitializeComponent (); DeviceNetworkInformation.NetworkAvailabilityChanged + = DeviceNetworkInformation_NetworkAvailabilityChanged;  privat tomt DeviceNetworkInformation_NetworkAvailabilityChanged (objekt sender, NetworkNotificationEventArgs e) if (e.NotificationType == NetworkNotificationType.InterfaceDisconnected) MessageBox.Show ("Disconnected");  annet hvis (e.NotificationType == NetworkNotificationType.InterfaceConnected) MessageBox.Show ("Connected"); 

Returparametrene inneholder en eiendom som kalles NotificationType, av typen NetworkNotificationType, som forteller oss gjeldende nettverksstatus.

Men med DeviceNetworkInformation Du kan også få annen informasjon om den nåværende nettverksstatusen, for eksempel om brukeren har aktivert mobildataforbindelsen (IsCellularDataEnabled), Wi-Fi-tilkoblingen (IsWiFiEnabled) eller roaming-alternativer (IsCellularDataRoamingOptions).

Rammen tilbyr en annen nyttig klasse for å håndtere nettverksforbindelser som kalles NetworkInterface. Ved å bruke NetworkInterfaceType eiendom, vil du kunne identifisere hvilken tilkoblingstype som for øyeblikket er i bruk. For eksempel kan vi bruke denne egenskapen for å unngå å laste ned store filer mens du bruker en mobil forbindelse.

NetworkInterfaceType er en oppregner som kan anta mange verdier. De viktigste er:

  • MobileBroadbandGsm og MobileBroadbandCdma når telefonen er koblet til et mobilnettverk (GSM eller CDMA, i henhold til landet)
  • Wireless80211, når telefonen er koblet til et Wi-Fi-nettverk

I den følgende prøven viser vi en melding på skjermen med gjeldende tilkoblingstype:

privat ugyldig OnCheckConnectionTypeClicked (objekt sender, RoutedEventArgs e) if (NetworkInterface.NetworkInterfaceType == NetworkInterfaceType.MobileBroadbandGsm || NetworkInterface.NetworkInterfaceType == NetworkInterfaceType.MobileBroadbandCdma) MessageBox.Show ("Mobile");  annet hvis (NetworkInterface.NetworkInterfaceType == NetworkInterfaceType.Wireless80211) MessageBox.Show ("Wi-Fi"); 

Utfører nettverksoperasjoner: HttpClient

Windows Phone Framework har to innebygde klasser for å utføre nettverksoperasjoner: WebClient og HttpWebRequest. Dessverre er ingen av dem perfekte. WebClient er veldig enkelt å bruke, men det er basert på den gamle tilbakeringingsmetoden (med mindre du installerer Asynk for. NET pakke vi diskuterte tidligere i denne serien). HttpWebRequest er veldig kraftig, men det er komplisert å bruke og basert på et gammelt asynkront mønster som er vanskelig å forstå.

Windows Runtime har introdusert en ny klasse som heter Httpclient, som tar det beste fra begge verdener. Det er kraftig og gir god ytelse, men det er enkelt å bruke og tilbyr metoder som er basert på det nye asynk og ventende mønsteret. Denne klassen er tilgjengelig i hele Windows Runtime for Windows Store-apper, men den er ikke inkludert i Windows Phone Runtime-undersettet. Du må installere den fra NuGet.

De Httpclient klassen, som vi ser senere, er flott, ikke bare for å utføre generiske nettverksoperasjoner som nedlasting og opplasting av filer, men også for samhandling med webtjenester. Faktisk utsetter den asynkrone metoder for hver HTTP-kommando, som GET, POST, PUT, etc.

Merk: For å kunne kommunisere med nettverket må du aktivere ID_CAP_NETWORKING-alternativet i manifestfilen. Den er aktivert i hvert nytt Windows Phone-prosjekt som standard.

Laster ned data

Filer lastes vanligvis ned med GET HTTP-kommandoen, så Httpclient tilbyr GetAsync () metode. Å gjøre utviklerne liv enklere, Httpclient har noen innebygde metoder for å laste ned de vanligste filtypene, for eksempel GetStringAsync () for nedlasting av tekstfiler som XML-, RSS- eller REST-svar; eller GetByteArrayAsync () og GetStreamAsync () for å få binært filinnhold.

Det er veldig enkelt å laste ned strenger. Metoden GetStringAsync () krever som en parameter filens URL og returnerer filens innhold som en streng. I følgende eksempel kan du se hvordan du laster ned bloggens RSS-feed:

privat asynk ugyldig OnDownloadStringClicked (objekt sender, RoutedEventArgs e) HttpClient client = new HttpClient (); strengresultat = vent klient.GetStringAsync ("http://feeds.feedburner.com/qmatteoq_eng"); 

Når du har strengen, kan du utføre de nødvendige operasjonene i henhold til ditt scenario. I forrige eksempel kunne jeg ha analysert den returnerte XML med LINQ til XML for å vise nyhetslisten på skjermen.

Nedlasting av binære filer kan oppnås på mange måter. Du kan bruke GetByteArrayAsync () Hvis du foretrekker å jobbe med byte, eller GetStreamAsync () hvis du foretrekker å manipulere filens innhold som en strøm.

I følgende eksempel ser du hvordan du laster ned et bilde ved hjelp av GetByteArrayAsync () metode. Den returnerer en bytes array, som lett kan lagres i lokal lagring ved hjelp av APIene vi lærte om tidligere i denne serien.

privat asynk ugyldig OnDownloadFileClicked (objekt sender, RoutedEventArgs e) HttpClient client = new HttpClient (); byte [] bytes = avventer client.GetByteArrayAsync ("http://www.syncfusion.com/Content/en-US/Home/Images/syncfusion-logo.png"); StorageFile storageFile = avventer ApplicationData.Current.LocalFolder.CreateFileAsync ("picture.png", CreationCollisionOption.ReplaceExisting); IRandomAccessStream accessStream = venter storageFile.OpenAsync (FileAccessMode.ReadWrite); bruker (IOutputStream outputStream = accessStream.GetOutputStreamAt (0)) DataWriter writer = new DataWriter (outputStream); writer.WriteBytes (bytes); venter på writer.StoreAsync (); 

Ved å bruke DataWriter klasse, vi er i stand til å lagre byte array returnert av Httpclient klasse inn i en fil i lokal lagring kalt picture.png.

Hvis du trenger full kontroll over nedlastingsoperasjonen, kan du bruke generisk GetAsync () metode, som returnerer a HttpResponseMessage objekt med hele responsens innhold, som overskrifter, statuskode osv.

I følgende eksempel kan du se hvordan, ved å bruke GetAsync () metode, vi kan laste ned et bilde som en Strøm og vis den i en Bilde kontroll plassert på siden. Til metoden passerer vi en andre parameter av typen HttpCompletionOption, som forteller klassen når du skal markere operasjonen som fullført. Siden vi vil ha hele innholdet i svaret (som er det nedlastede bildet), bruker vi ResponseContentRead alternativ.

privat asynk ugyldig OnDownloadStreamClicked (objekt sender, RoutedEventArgs e) HttpClient client = new HttpClient (); HttpResponseMessage httpResponseMessage = avventer client.GetAsync ("http://www.syncfusion.com/Content/en-US/Home/Images/syncfusion-logo.png", HttpCompletionOption.ResponseContentRead); Stream stream = venter httpResponseMessage.Content.ReadAsStreamAsync (); BitmapImage image = nytt BitmapImage (); image.SetSource (strøm); Logo.Source = image; 

Legg merke til at de spesifikke metodene vi har sett tilbys av Httpclient Klassen er rett og slett en snarvei til metodene som tilbys av Innhold eiendom av HttpResponseMessage klasse (i den forrige prøven bruker vi ReadAsStreamAsync () Metode for å returnere responsens innhold som en Strøm).

Laster opp data

Opplasting av data oppnås på lignende måte: operasjonen utføres vanligvis ved hjelp av POST-kommandoen, slik at Httpclient klassen avslører PostAsync () metode for dette formålet.

Innholdet som skal sendes, er utarbeidet ved hjelp av HttpContent klassen, som tilbyr mange implementeringer: StreamContent å sende en fils strøm, ByteArrayContent å sende en binær fil, StringContent å sende en streng, eller MultipartFormDataContent å sende innhold som er kodet ved hjelp av MIME-typen for flere / form-data.

I følgende eksempel kan du se hvordan du laster opp en fils strøm til en tjeneste:

privat asynk ugyldig OnUploadFileClicked (objekt sender, RoutedEventArgs e) StorageFile storageFile = venter ApplicationData.Current.LocalFolder.GetFileAsync ("picture.png"); IRandomAccessStream accessStream = venter storageFile.OpenAsync (FileAccessMode.ReadWrite); HttpClient klient = ny HttpClient (); HttpContent content = nytt StreamContent (accessStream.AsStreamForRead ()); venter klient.PostAsync ("http://wp8test.azurewebsites.net/api/values", innhold); 

Etter at vi har hentet strømmen av en fil som er lagret i lokal lagring, sender vi det til en ny forekomst av StreamContent klasse. Så kaller vi PostAsync () metode, passerer tjenestens URL og HttpContent objekt som parametere.

Bruke REST-tjenester

REST (Representational State Transfer) er uten tvil den mest brukte tilnærmingen i dag i webtjenesteutvikling, spesielt i mobilverdenen.

REST-tjenester har blitt veldig populære av to grunner:

  • De er basert på HTTP-protokollen og de avslører operasjoner ved hjelp av standard HTTP-kommandoer (som GET, POST, PUT, etc.).
  • De returnerer data ved hjelp av vanlige språk som XML og JSON.

Nesten hver plattform støtter disse teknologiene, slik at du ikke trenger å lete etter spesialbiblioteker for å samhandle med dem som er nødvendig for WSDL-baserte webtjenester.

Vi har allerede sett hvordan, med Httpclient klassen, er det enkelt å samhandle med Internett ved å bruke standard HTTP-kommandoer. Mesteparten av tiden, for å samhandle med en REST-tjeneste, må du ganske enkelt utføre GetStringAsync () metode for å få XML eller JSON respons.

Når du har resultatet, må du mesteparten av tiden konvertere den til objekter som skal brukes i applikasjonen. Tidligere i denne serien diskuterte vi den enkleste måten å oppnå denne oppgaven: deserialisering, som betyr å oversette ren tekst til komplekse objekter. Vi kan bruke DataContractSerializer eller DataContractJsonSerializer klasser for å gjøre dette. I dette tilfellet må du bare henvise til deserialiseringsprosessen siden prosedyren er den samme.

privat asynk ugyldig OnConsumeServiceClicked (objekt sender, RoutedEventArgs e) HttpClient client = new HttpClient (); strengresultat = vent på client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values"); bruker (MemoryStream ms = new MemoryStream (Encoding.Unicode.GetBytes (result))) DataContractJsonSerializer serializer = ny DataContractJsonSerializer (typeof (Liste)); Liste people = serializer.ReadObject (ms) som Liste; 

Vi antar at tjenesten returnerer, i JSON-format, en liste over personer:

["id": 1, "navn": "Matteo", "etternavn": "Pagani", "id": 2, "navn": "John", "etternavn": "Doe"]

Med hjelp av DataContractJsonSerializer klasse, kan vi konvertere forrige JSON til en liste over Person objekter, som er den samme klassen vi har brukt i mange andre prøver i denne serien. Forskjellen i denne prøven er at vi er i stand til å kontrollere serialiseringsprosessen, for eksempel er eiendomsnavnene som returneres fra JSON, annerledes enn de vi bruker i våre klasser. Dette er et veldig vanlig scenario når det gjelder JSON siden eiendomsnavn er vanligvis små bokstaver, mens i C # -objekter er de CamelCase. Dette resultatet oppnås ved å bruke [DataMember] attributt, som kan brukes til egenskapene vi vil serialisere. I følgende eksempel kan du se at attributtet gir en eiendom som heter Navn, som kan brukes til å spesifisere hvilket eiendomnavn vi forventer å finne i JSON-filen.

offentlig klasse Person [DataMember (Name = "id")] offentlig int Id get; sett;  [DataMember (Name = "name")] offentlig streng Navn get; sett;  [DataMember (Name = "etternavn")] offentlig streng Etternavn get; sett; 

Denne tilnærmingen har en downside: REST-tjenester returnerer alltid en vanlig streng, mens DataContractJsonSerializer klassen krever a Strøm som en inngangsparameter for ReadObject () metode, så vi er alltid tvunget til å konvertere den med en Memory gjenstand.

Det er en annen måte å oppnå det samme resultatet på. La meg introdusere JSON.NET, et tredjepartsbibliotek som tilbyr noen ekstra nyttige funksjoner for å håndtere JSON-data. I tillegg gir den bedre ytelse og kan deserialisere komplekse JSON-filer raskere.

Det kan enkelt installeres ved hjelp av NuGet, og dets offisielle nettside tilbyr sammenligninger med andre JSON-biblioteker og detaljert dokumentasjon.

I følgende eksempel bruker vi JSON.NET til å oppnå samme resultat som koden vi tidligere har brukt:

privat asynk ugyldig OnGetDataClicked (objekt sender, RoutedEventArgs e) HttpClient client = new HttpClient (); strengresultat = vent på client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values"); Liste folk = JsonConvert.DeserializeObject> (Resultat); 

De JsonConvert klasse (som er en del av Newtonsoft.Json namespace) avslører DeserializeObject() metode, hvor T er objektets type vi forventer i retur. Som en inngangsparameter krever det bare JSON-strengen som vi har lastet ned fra tjenesten.

Det er også mulig å kontrollere deserialiseringsprosessen ved hjelp av attributter, som vi tidligere gjorde med DataMember Egenskap. I følgende eksempel kan du se hvordan vi kan manuelt definere hvordan JSON-egenskaper skal oversettes:

offentlig klasse Person [JsonProperty ("id")] offentlig int Id get; sett;  [JsonProperty ("navn")] offentlig streng Navn get; sett;  [JsonProperty ("etternavn")] offentlig streng Etternavn get; sett; 

Tips: Du må ofte bruke tredjepartstjenester, slik at du ikke vet nøyaktig kartlegging mellom enheter og JSON-data. Det er et nettsted som vil hjelpe deg i dette scenariet: http://json2csharp.com/. Bare lim inn JSON returnert av din tjeneste, og det vil generere for deg de nødvendige C # -klassene for å kartlegge JSON-dataene. 

LINQ til JSON

En annen interessant funksjon introdusert av JSON.NET er LINQ til JSON, som er et LINQ-basert språk som, ligner på LINQ til XML, kan brukes til å manipulere en JSON-streng for å trekke ut akkurat den informasjonen du trenger. Denne tilnærmingen er nyttig når du ikke virkelig trenger å bruke deserialisering, men trenger bare å trekke ut noen data fra JSON-responsen du mottok fra tjenesten.

Utgangspunktet for å bruke LINQ til JSON er JObject klassen, som identifiserer en JSON-fil. For å begynne å jobbe med det, må du bare ringe Parse () metode som passerer som parameter JSON-strengen, som vist i følgende prøve:

privat async void OnParseJson (objekt sender, RoutedEventArgs e) HttpClient client = new HttpClient (); strengresultat = vent på client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values"); JObject json = JObject.Parse (resultat); 

Nå er du klar til å utføre noen operasjoner. La oss ta en titt på de vanligste.

Enkel JSON

Her er et eksempel på en enkel JSON-fil:

"Id": 1, "Navn": "Matteo", "Etternavn": "Pagani"

Med LINQ til JSON kan vi trekke ut en enkelt eiendoms verdi på følgende måte:

privat async void OnParseJson (objekt sender, RoutedEventArgs e) HttpClient client = new HttpClient (); strengresultat = vent på client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values/1"); JObject json = JObject.Parse (resultat); streng verdi = json ["Navn"]. Verdi(); 

De JObject klassen behandles som en samling, slik at du enkelt kan få tilgang til en eiendom med navnet som nøkkel. Til slutt kan du pakke ut verdien ved å bruke Verdi() metode, hvor T er datatypen vi forventer å bli lagret.

Kompleks JSON

Som C # -objekter kan JSON-objekter også ha komplekse egenskaper, som vist i følgende eksempel:

"Id": 1, "Navn": "Matteo", "Etternavn": "Pagani", "Adresse": "Gate": "Feil adresse", "By": "Milano"

Adresse er en kompleks egenskap fordi den inneholder andre nestede egenskaper. For å få tilgang til disse egenskapene, må vi bruke SelectToken () metode, passerer hele JSON banen som en parameter:

privat async void OnParseJson (objekt sender, RoutedEventArgs e) HttpClient client = new HttpClient (); strengresultat = vent på client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values/1"); JObject json = JObject.Parse (resultat); string city = json.SelectToken ("Address.City"). Verdi(); 

Med Address.City sti, vi er i stand til å trekke ut verdien av By eiendom som er en del av Adresse node.

JSON samlinger

Når du håndterer JSON samlinger, kan du bruke Barn () metode for å få tilgang til alle barns noder av en bestemt eiendom. La oss for eksempel bruke en JSON-kode som vi tidligere har sett:

["Id": 1, "Navn": "Matteo", "Etternavn": "Pagani", "Id": 2, "Navn": "John", "Etternavn": "Doe"]

I dette tilfellet kan vi bruke JArray klasse og Barn () metode for å trekke ut alle samlingens elementer. I den følgende prøven kan du se hvordan vi bruker den til å få en delkolleksjon med bare Navn eiendomens verdier.

privat asynk ugyldig OnGetDataClicked (objekt sender, RoutedEventArgs e) HttpClient client = new HttpClient (); strengresultat = vent på client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values"); JArray json = JArray.Parse (resultat); Liste list = json.Children (). Velg (x => x ["Navn"]. Verdi()).Ramse opp(); 

Bakgrunnsoverføringer

De Httpclient klasse vi tidligere har sett, som WebClient og HttpWebRequest klasser, kan bare brukes til forgrunnsoperasjoner. Når programmet er suspendert, blir nettverksoverføringene avbrutt.

Når vi må håndtere store dataoverføringer, tvinger brukeren til å holde appen åpen, skaper ikke den beste brukeropplevelsen. For dette scenariet har Windows Phone 7.5 introdusert API for bakgrunnsoverføring som kan brukes til å starte en nedlastings- eller opplastingsoperasjon, og for å fortsette den, selv om appen er suspendert.

Det er imidlertid noen begrensninger som er innført for å unngå batteriproblemer og høyt dataplanforbruk:

  • Hvis telefonen er koblet til et mobilnettverk, kan ikke filer som er større enn 20 MB, lastes ned.
  • Hvis telefonen er koblet til et Wi-Fi-nettverk, kan ikke filer som er større enn 100 MB, lastes ned.
  • Grensen på 100 MB kan bare overskrides hvis telefonen er koblet til et Wi-Fi-nettverk, og batteriet lades.
  • En enkelt applikasjon kan kjøre opptil 25 bakgrunnsoverføringsoperasjoner.
  • Det globale operativsystemets kø kan inneholde opptil 500 bakgrunnsoverføringsoperasjoner.
  • Telefonen kan utføre maksimalt to overføringsoperasjoner om gangen.

En bakgrunnsoverføring identifiseres av BackgroundTransferRequest klasse, som er en del av Microsoft.Phone.BackgroundTransfer navnerom. Som utviklere har vi kontroll over noen forhold som må tilfredsstilles for en bakgrunnsoverføring som er opprettet i vår søknad, for å starte, takket være TransferPreferences eiendom som kan få følgende verdier:

  • Ingen, standardverdien: Overføringen starter bare hvis telefonen er koblet til et Wi-Fi-nettverk og batteriet lades.
  • AllowBattery: Overføringen starter bare hvis telefonen er koblet til et Wi-Fi-nettverk, uavhengig av strømkilden.
  • AllowCelullar: Overføringen starter bare hvis telefonen lades, uavhengig av nettverkstilkoblingen.

AllowCellularAndBattery: Startes alltid overføringen, uansett tilkobling og strømkildeforhold.

De BackgroundTransferRequest klassen avslører to hendelseshåndterere som kan brukes til å kontrollere overføringen:

  • TransferStatusChanged utløses når overføringsstatus endres. Parameteren returnert med metoden inneholder a TransferStatus objekt som forteller deg om gjeldende status (som fullført når overføringen slutter, eller pauset når overføringen er pauset). Det er også spesifikke statuser som starter med Venter prefiks som forteller deg når en overføring er suspendert fordi betingelsene som er definert i TransferPreferences Eiendommen er ikke fornøyd. For eksempel, WaitingForWiFi er angitt når overføringen venter på at telefonen skal være koblet til et Wi-Fi-nettverk for å starte.
  • TransferProgressChanged utløses når en overførings fremdrift endres, noe som betyr at nye data er lastet ned eller lastet opp. Vanligvis er denne hendelseshandleren koblet til en ProgressBar kontroll siden det avslører egenskaper for å varsle deg hvor mye data har blitt overført og hvor mye data som fortsatt må lastes ned eller sendes.

Når du har definert en bakgrunnsoverføring, må du legge den til i operativsystemets kø. Windows Phone vil ta vare på å starte den når de angitte vilkårene er oppfylt. For å utføre denne oppgaven bruker vi BackgroundTransferService klassen, som er den sentrale bakgrunnsoverføringslederen. Du kan legge til, fjerne eller liste bakgrunnsoverføringer som tilhører programmet.

I følgende eksempel kan du se en bakgrunnsoverføringsdefinisjon:

privat BackgroundTransferRequest backgroundRequest; privat ugyldig OnStartBackgroundDownloadClicked (objekt sender, RoutedEventArgs e) Uri sourceUrl = ny Uri ("http://wpsauce.com/wp-content/uploads/2011/11/windows_phone_logo.jpg"); Uri destinationUrl = ny Uri ("/ Shared / Transfers / windows_phone_logo.jpg", UriKind.RelativeOrAbsolute); backgroundRequest = ny BackgroundTransferRequest (sourceUrl, destinationUrl); backgroundRequest.TransferStatusChanged + = backgroundRequest_TransferStatusChanged; backgroundRequest.TransferPreferences = TransferPreferences.AllowCellularAndBattery; BackgroundTransferService.Add (backgroundRequest);  ugyldig bakgrunnRequest_TransferStatusChanged (objekt sender, BackgroundTransferEventArgs e) if (backgroundRequest.TransferStatus == TransferStatus.Completed) // Administrer den nedlastede filen. BackgroundTransferService.Remove (backgroundRequest); 

Vi registrerer denne overføringen som skal utføres uavhengig av tilgjengelig nettverksforbindelse og strømkilde. Den forrige prøven er relatert til en nedlastingsoperasjon, så vi må definere en kilde URI (filen som skal lastes ned) og en destinasjons-URI (den lokale lagringsbanen der filen skal lagres). I motsetning til hva vi har sett med Httpclient, vi behøver ikke ta vare på spareprosessen; filen lastes automatisk ned og lagres i lokal lagring, siden nedlastingen også kan avsluttes når appen er suspendert. Både kilde- og destinasjons-URI er bestått som parametere for BackgroundTransferRequest konstruktør.

Merk: Bakgrunnsoverføringer som brukes til å utføre nedlastingsoperasjoner, må alltid lagre filen i delen Delt / Overføringer i lokal lagring, som automatisk opprettes når appen er installert, ellers får du et unntak. Når nedlastingen er fullført, kan du flytte filen til en annen posisjon om nødvendig, men du kan ikke planlegge en bakgrunnsoverføring som prøver å laste ned en fil i en annen mappe.

Deretter abonnerer vi på TransferStatusChanged begivenhet. Hvis nedlastingen er fullført mens appen er i forgrunnen, kan vi administrere den nedlastede filen, for eksempel hvis det er et bilde, kan vi vise det. Legg merke til Fjerne() operasjon som vi utfører på BackgroundTransferService klasse. Det er veldig viktig å alltid utføre denne oppgaven fordi operativsystemet ikke automatisk fjerner fullførte overføringer fra programmets kø, og det kan føre til uventede problemer, siden et program ikke kan planlegge mer enn 25 overføringer.

I stedet, hvis du trenger å laste opp en fil, må du opprette en BackgroundTransferRequest objekt på en annen måte. Du må fortsatt definere to URIer: kilden (filen som skal lastes opp) og destinasjonen (en tjeneste som kan motta filen ved hjelp av HTTP-kommandasettet i Metode eiendom). Destinasjons URI kan bestås i BackgroundTransferRequestKonstruktør (som vi gjorde tidligere), men kilden URI må settes inn i UploadLocation eiendom, som i følgende utvalg:

privat ugyldig OnUploadFile () Uri destinationUrl = ny Uri ("http://wp8test.azurewebsites.com/api/values", UriKind.Relative); Uri sourceUri = ny Uri ("/ Shared / Transfers / image.png", UriKind.Relative); BackgroundTransferRequest request = ny BackgroundTransferRequest (destinationUrl); request.UploadLocation = sourceUri; request.Method = "POST"; BackgroundTransferService.Add (forespørsel); 

Konklusjon

I denne artikkelen har vi sett hvordan du arbeider med en av de mest brukte funksjonene i en smarttelefon: en Internett-tilkobling. I detalj har vi lært:

  • Selv om en Internett-tilkobling er en nødvendighet for alle enheter, bør vi være oppmerksomme på at noen ganger kanskje ikke brukere har en tilgjengelig tilkobling. Det er viktig å kontrollere om telefonen er koblet til Internett før du foretar noen nettverksoperasjon.
  • Httpclient er en ny klasse introdusert i Windows Runtime som bidrar til å utføre nettverksoperasjoner. Vi har sett hvordan du bruker den til å laste ned og laste opp filer, og samhandle med tjenester.
  • Nedlasting og opplasting av filer er en vanlig oppgave, men i dag må flere og flere applikasjoner samhandle med webtjenester for å få de dataene de trenger. I denne artikkelen har vi lært hvordan, takket være JSON.NET-biblioteket, er det enkelt å jobbe med REST-tjenester og konvertere JSON-data til C # -objekter.
  • Httpclient er en stor hjelp, men det fungerer bare hvis søknaden er i forgrunnen. Når den er suspendert, blir nettverksoperasjoner avbrutt. Til dette formål tilbyr rammen noen spesifikke APIer for å utføre nedlasting og opplasting av operasjoner, selv i bakgrunnen når appen ikke er i bruk.

Denne opplæringen representerer et kapittel fra Windows Phone 8 Succinctly, en gratis eBook fra teamet ved Syncfusion.