Windows Phone 8 Succinctly Data Access-Network

Kontrollera internetanslutningen

Alla Windows Phone-enheter har en inbyggd nätverksanslutning, men av samma anledning lärde vi oss hur vi lagrar data lokalt, vi måste vara redo att hantera hur användarna använder vår applikation när en anslutning saknas.

I detta syfte innehåller Windows Phone-ramen en klass som kan användas för att upptäcka information om den uppringda Internet-anslutningen DeviceNetworkInformation, som är en del av Microsoft.Phone.Net.NetworkInformation namespace.

Den viktigaste är IsNetworkAvailable, som berättar om en internetanslutning är tillgänglig. Vi bör alltid använda detta API innan du utför en operation som kräver en anslutning, som följande exempel:

privat tomt OnCheckConnectionClicked (objekt avsändare, RoutedEventArgs e) if (DeviceNetworkInformation.IsNetworkAvailable) MessageBox.Show ("Du är ansluten till Internet"); // Utför nätverksoperationer.  else MessageBox.Show ("Du är inte ansluten till Internet"); 

Klassen erbjuder också en händelse som heter NetworkAvailabilityChanged som utlöses varje gång anslutningsstatus ändras. Det är användbart om du snabbt vill reagera på nätverksändringar, till exempel att aktivera eller inaktivera vissa programfunktioner.

public MainPage () InitializeComponent (); DeviceNetworkInformation.NetworkAvailabilityChanged + = DeviceNetworkInformation_NetworkAvailabilityChanged;  privat tomt DeviceNetworkInformation_NetworkAvailabilityChanged (objekt avsändare, NetworkNotificationEventArgs e) if (e.NotificationType == NetworkNotificationType.InterfaceDisconnected) MessageBox.Show ("Disconnected");  annars om (e.NotificationType == NetworkNotificationType.InterfaceConnected) MessageBox.Show ("Connected"); 

Returparametrarna innehåller en egenskap som heter NotificationType, av typen NetworkNotificationType, vilket berättar om aktuell nätverksstatus.

Men med DeviceNetworkInformation Du kan även få annan information om den aktuella nätverksstatusen, som om användaren har aktiverat mobildataanslutningen (IsCellularDataEnabled), Wi-Fi-anslutningen (IsWiFiEnabled) eller roamingalternativ (IsCellularDataRoamingOptions).

Ramverket erbjuder en annan användbar klass för att hantera nätverksanslutningar som heter Network. Genom att använda NetworkInterfaceType egendom, kan du identifiera vilken anslutningstyp som används för närvarande. Till exempel kan vi använda den här egenskapen för att undvika att ladda ner stora filer när du använder en mobil anslutning.

NetworkInterfaceType är en talare som kan anta många värden. De viktigaste är:

  • MobileBroadbandGsm och MobileBroadbandCdma när telefonen är ansluten till ett mobilnät (GSM eller CDMA, beroende på land)
  • Wireless80211, när telefonen är ansluten till ett Wi-Fi-nätverk

I följande exempel visas ett meddelande på skärmen med aktuell anslutningstyp:

privat tomt OnCheckConnectionTypeClicked (objekt avsändare, RoutedEventArgs e) if (NetworkInterface.NetworkInterfaceType == NetworkInterfaceType.MobileBroadbandGsm || NetworkInterface.NetworkInterfaceType == NetworkInterfaceType.MobileBroadbandCdma) MessageBox.Show ("Mobile");  annars om (NetworkInterface.NetworkInterfaceType == NetworkInterfaceType.Wireless80211) MessageBox.Show ("Wi-Fi"); 

Utför nätverksoperationer: HttpClient

Windows Phone Framework har två inbyggda klasser för att utföra nätverksoperationer: WebClient och HttpWebRequest. Tyvärr är ingen av dem perfekta. WebClient är mycket lätt att använda, men det är baserat på den gamla återuppringningsmetoden (om du inte installerar Async för .NET paket som vi diskuterade tidigare i denna serie). HttpWebRequest är mycket kraftfull, men det är komplext att använda och bygger på ett gammalt asynkront mönster som är svårt att förstå.

Windows Runtime har introducerat en ny klass som heter Httpclient, som tar bäst av båda världarna. Den är kraftfull och erbjuder bra prestanda, men det är lätt att använda och erbjuder metoder som bygger på det nya asynk och väntar mönstret. Den här klassen är tillgänglig i hela Windows Runtime for Windows Store-appar, men den ingår inte i Windows Phone Runtime-underuppsättningen-du måste installera den från NuGet.

De Httpclient klass, som vi ser senare, är bra, inte bara för att utföra generiska nätverksoperationer som nedladdning och uppladdning av filer, men också för att interagera med webbtjänster. Faktum är att det exponerar asynkrona metoder för varje HTTP-kommando, som GET, POST, PUT, etc.

Obs! För att kunna interagera med nätverket måste du aktivera alternativet ID_CAP_NETWORKING i manifestfilen. Den är aktiverad i varje nytt Windows Phone-projekt som standard.

Hämtar data

Filer laddas vanligtvis med hjälp av GET HTTP-kommandot, så Httpclient erbjuder GetAsync () metod. Att göra utvecklarens liv enklare, Httpclient har några inbyggda metoder för att hämta de vanligaste filtyperna, t.ex. GetStringAsync () för nedladdning av textfiler som XML, RSS eller REST-svar; eller GetByteArrayAsync () och GetStreamAsync () för att få binärt filinnehåll.

Att ladda ner strängar är väldigt enkelt. Metoden GetStringAsync () kräver som en parameter filens URL och returnerar filens innehåll som en sträng. I följande exempel kan du se hur du hämtar min blogg RSS-flöde:

privat async ogiltig OnDownloadStringClicked (objekt avsändare, RoutedEventArgs e) HttpClient client = new HttpClient (); strängresultat = väntar client.GetStringAsync ("http://feeds.feedburner.com/qmatteoq_eng"); 

När du har strängen kan du utföra de nödvändiga operationerna enligt ditt scenario. I det föregående provet kunde jag till exempel ha analyserat den returnerade XML med LINQ till XML för att visa nyhetslistan på skärmen.

Nedladdning av binära filer kan åstadkommas på många sätt. Du kan använda GetByteArrayAsync () om du föredrar att arbeta med byte eller GetStreamAsync () om du föredrar att manipulera filens innehåll som en ström.

I följande exempel ser du hur du laddar ner en bild med hjälp av GetByteArrayAsync () metod. Den returnerar en bytes array, som enkelt kan sparas i lokal lagring med hjälp av API-erna som vi lärde oss om tidigare i denna serie.

privat async ogiltig OnDownloadFileClicked (objekt avsändare, RoutedEventArgs e) HttpClient client = new HttpClient (); byte [] bytes = väntar client.GetByteArrayAsync ("http://www.syncfusion.com/Content/en-US/Home/Images/syncfusion-logo.png"); StorageFile storageFile = väntar ApplicationData.Current.LocalFolder.CreateFileAsync ("picture.png", CreationCollisionOption.ReplaceExisting); IRandomAccessStream accessStream = väntar storageFile.OpenAsync (FileAccessMode.ReadWrite); använder (IOutputStream outputStream = accessStream.GetOutputStreamAt (0)) DataWriter writer = new DataWriter (outputStream); writer.WriteBytes (byte); väntar på författare. StoraAsync (); 

Genom att använda DataWriter klass, vi kan spara byte array returneras av Httpclient klass i en fil i det lokala lagret kallas picture.png.

Om du behöver fullständig kontroll över nedladdningsoperationen kan du använda generiken GetAsync () metod som returnerar a HttpResponseMessage objekt med hela svarets innehåll, till exempel rubriker, statuskod etc..

I följande exempel kan du se hur, genom att använda GetAsync () metod, vi kan ladda ner en bild som en Strömma och visa den i en Bild kontroll placerad på sidan. Till metoden passerar vi en andra parameter av typen HttpCompletionOption, som berättar för klassen när man markerar operationen som färdigställd. Eftersom vi vill ha hela innehållet i svaret (vilket är den nedladdade bilden) använder vi ResponseContentRead alternativ.

privat async ogiltig OnDownloadStreamClicked (objekt avsändare, RoutedEventArgs e) HttpClient client = new HttpClient (); HttpResponseMessage httpResponseMessage = väntar client.GetAsync ("http://www.syncfusion.com/Content/en-US/Home/Images/syncfusion-logo.png", HttpCompletionOption.ResponseContentRead); Stream stream = väntar httpResponseMessage.Content.ReadAsStreamAsync (); BitmapImage image = nytt BitmapImage (); image.SetSource (stream); Logo.Source = image; 

Observera att de specifika metoder som vi har sett erbjuds av Httpclient klassen är helt enkelt en genväg till de metoder som erbjuds av Innehåll egenskapen hos HttpResponseMessage klass (i föregående prov använder vi ReadAsStreamAsync () Metod för att returnera svarets innehåll som en Strömma).

Uppladdning av data

Uppladdning av data uppnås på ett liknande sätt: operationen utförs vanligen med POST-kommandot, så att Httpclient klassen avslöjar PostAsync () metod för detta ändamål.

Innehållet som ska skickas utarbetas med hjälp av HttpContent klass, som erbjuder många implementeringar: StreamContent att skicka en fils ström, ByteArrayContent att skicka en binär fil, StringContent att skicka en sträng, eller MultipartFormDataContent att skicka innehåll som kodas med hjälp av multipart / form-data MIME-typ.

I följande exempel kan du se hur du laddar upp en fils ström till en tjänst:

privat async ogiltig OnUploadFileClicked (objekt avsändare, RoutedEventArgs e) StorageFile storageFile = väntar ApplicationData.Current.LocalFolder.GetFileAsync ("picture.png"); IRandomAccessStream accessStream = väntar storageFile.OpenAsync (FileAccessMode.ReadWrite); HttpClient client = new HttpClient (); HttpContent content = new StreamContent (accessStream.AsStreamForRead ()); vänta klient.PostAsync ("http://wp8test.azurewebsites.net/api/values", innehåll); 

När vi har hämtat strömmen av en fil som lagrats i lokal lagring, skickar vi den till en ny instans av StreamContent klass. Då kallar vi PostAsync () metod, som skickar tjänstens webbadress och HttpContent objekt som parametrar.

Använda REST-tjänster

REST (Representational State Transfer) är utan tvekan det mest använda tillvägagångssättet för närvarande inom webbtjänstutveckling, särskilt i mobilvärlden.

REST-tjänster har blivit mycket populära av två skäl:

  • De är baserade på HTTP-protokollet och de exponerar operationer med standard HTTP-kommandon (som GET, POST, PUT, etc.).
  • De returnerar data med hjälp av vanliga språk som XML och JSON.

Nästan alla plattformar stödjer nationellt dessa tekniker, så du behöver inte leta efter specialbibliotek att interagera med dem som behövs för WSDL-baserade webbtjänster.

Vi har redan sett hur, med Httpclient klass, är det enkelt att interagera med webben genom att använda standard HTTP-kommandon. För det mesta, för att interagera med en REST-tjänst, måste du helt enkelt utföra GetStringAsync () metod för att få XML eller JSON svaret.

När du har fått resultatet, måste du oftast konvertera det till objekt som ska användas inom applikationen. Tidigare i denna serie diskuterade vi det enklaste sättet att uppnå denna uppgift: deserialisering, vilket innebär att man översätter vanlig text till komplexa objekt. Vi kan använda DataContractSerializer eller DataContractJsonSerializer klasser för att göra detta. I det här fallet behöver du bara hänvisa till deserialiseringsprocessen eftersom proceduren är densamma.

privat async void OnConsumeServiceClicked (objekt avsändare, RoutedEventArgs e) HttpClient client = new HttpClient (); strängresultat = väntar client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values"); (MemoryStream ms = new MemoryStream (Encoding.Unicode.GetBytes (result))) DataContractJsonSerializer serializer = new DataContractJsonSerializer (typof (Listof)); Lista people = serializer.ReadObject (ms) som lista; 

Vi antar att tjänsten returnerar, i JSON-format, en lista över personer:

["id": 1, "namn": "Matteo", "efternamn": "Pagani", "id": 2, "namn": "John"

Med hjälp av DataContractJsonSerializer klass, kan vi konvertera tidigare JSON till en lista över Person objekt, som är samma klass som vi har använt i många andra prover i denna serie. Skillnaden i det här provet är att vi kan styra serialiseringsprocessen, om exempelvis de egendomsnamn som returneras från JSON är annorlunda än de vi använder i våra klasser. Detta är ett mycket vanligt scenario när det handlar om JSON eftersom egenskapsnamn är typiskt små bokstäver, medan i C # -objekt är de CamelCase. Detta resultat uppnås genom att använda [DataMember] attribut som kan tillämpas på de egenskaper vi vill serialisera. I följande exempel kan du se att attributet erbjuder en egendom som heter namn, som kan användas för att ange vilket egendomsnamn vi förväntar oss att hitta i JSON-filen.

offentlig klass Person [DataMember (Name = "id")] public int Id get; uppsättning;  [DataMember (Name = "name")] public string Namn get; uppsättning;  [DataMember (Namn = "Efternamn")] Offentlig sträng Efternamn get; uppsättning; 

Denna inställning har en nackdel: REST-tjänster returnerar alltid en vanlig sträng, medan DataContractJsonSerializer klassen kräver a Strömma som en ingångsparameter för Readobject () metod, så vi är alltid tvungna att konvertera det med hjälp av a Memory objekt.

Det finns ett annat sätt att uppnå samma resultat. Låt mig presentera JSON.NET, ett tredje part bibliotek som erbjuder några ytterligare användbara funktioner för hantering av JSON data. Dessutom erbjuder den bättre prestanda och kan deserialisera komplexa JSON-filer snabbare.

Det kan enkelt installeras med NuGet, och dess officiella hemsida erbjuder jämförelser med andra JSON-bibliotek och detaljerad dokumentation.

I följande exempel använder vi JSON.NET för att uppnå samma resultat som den kod som vi tidigare använt:

privat asynk ogiltig OnGetDataClicked (objekt avsändare, RoutedEventArgs e) HttpClient client = new HttpClient (); strängresultat = väntar client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values"); Lista folk = JsonConvert.DeserializeObject> (Resultat); 

De JsonConvert klass (som ingår i Newtonsoft.Json namespace) exponerar DeserializeObject() metod, var T är objektets typ som vi förväntar oss i gengäld. Som en ingångsparameter krävs det endast den JSON-sträng som vi har laddat ner från tjänsten.

Det är också möjligt att kontrollera deserialiseringsprocessen med attribut, som vi tidigare gjorde med DataMember attribut. I följande exempel kan du se hur vi manuellt kan definiera hur JSON-egenskaper ska översättas:

offentlig klass Person [JsonProperty ("id")] public int Id get; uppsättning;  [JsonProperty ("name")] allmän sträng Namn get; uppsättning;  [JsonProperty ("efternamn")] public string Efternamn get; uppsättning; 

Tips: Du måste ofta använda tjänster från tredje part, så du vet inte exakt kartläggningen mellan enheter och JSON-data. Det finns en webbplats som hjälper dig i det här scenariot: http://json2csharp.com/. Klistra enkelt in den JSON som returneras av din tjänst, och det kommer att generera för dig de erforderliga C # -klassen för att kartlägga JSON-data. 

LINQ till JSON

En annan intressant egenskap som introduceras av JSON.NET är LINQ till JSON, vilket är ett LINQ-baserat språk som, till skillnad från LINQ till XML, kan användas för att manipulera en JSON-sträng för att extrahera bara den information du behöver. Detta tillvägagångssätt är användbart när du verkligen inte behöver använda deserialisering, men behöver bara extrahera vissa data från det JSON-svar du fått från tjänsten.

Utgångspunkten för att använda LINQ till JSON är JObject klass, som identifierar en JSON-fil. För att börja jobba med det behöver du bara ringa Parse () metod som passerar som parameter JSON-strängen, som visas i följande prov:

privat async void OnParseJson (objekt avsändare, RoutedEventArgs e) HttpClient client = new HttpClient (); strängresultat = väntar client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values"); JObject json = JObject.Parse (resultat); 

Nu är du redo att utföra vissa operationer. Låt oss ta en titt på de vanligaste.

Enkel JSON

Här är ett exempel på en enkel JSON-fil:

"Id": 1, "Namn": "Matteo", "Efternamn": "Pagani"

Med LINQ till JSON kan vi extrahera en egen fastighets värde på följande sätt:

privat async void OnParseJson (objekt avsändare, RoutedEventArgs e) HttpClient client = new HttpClient (); strängresultat = väntar client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values/1"); JObject json = JObject.Parse (resultat); strängvärde = json ["Name"]. Värde(); 

De JObject klassen behandlas som en samling, så du kan helt enkelt komma åt en egendom med namnet som en nyckel. I slutändan kan du extrahera värdet genom att använda Värde() metod, var T är den datatyp vi förväntar oss att lagras.

Komplex JSON

Liksom C # -objekt kan JSON-objekt också ha komplexa egenskaper, som visas i följande exempel:

"Id": 1, "Namn": "Matteo", "Efternamn": "Pagani", "Adress": "Street": "Fel adress", "Stad": "Milano"

Adress är en komplex egenskap eftersom den innehåller andra kapslade egenskaper. För att komma åt dessa egenskaper måste vi använda SelectToken () metod, som överför hela JSON-sökvägen som en parameter:

privat async void OnParseJson (objekt avsändare, RoutedEventArgs e) HttpClient client = new HttpClient (); strängresultat = väntar client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values/1"); JObject json = JObject.Parse (resultat); strängstad = json.SelectToken ("Address.City"). Värde(); 

Med Postort väg, vi kan extrahera värdet av Stad egendom som ingår i Adress nod.

JSON samlingar

När du hanterar JSON-samlingar kan du använda Barn() metod för att få tillgång till alla barnens noder av en viss egendom. Låt oss exempelvis använda en JSON-kod som vi tidigare sett:

["Id": 1, "Namn": "Matteo", "Efternamn": "Pagani", "Id": 2, "Namn": "John", "Efternamn": "Doe"]

I det här fallet kan vi använda JArray klass och Barn() metod för att extrahera alla samlingens element. I följande exempel kan du se hur vi använder det för att få en delkollektion med endast namn egenskapens värden.

privat asynk ogiltig OnGetDataClicked (objekt avsändare, RoutedEventArgs e) HttpClient client = new HttpClient (); strängresultat = väntar client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values"); JArray json = JArray.Parse (resultat); Lista list = json.Children (). Välj (x => x ["Name"]. Värde()).Att lista(); 

Bakgrundsöverföringar

De Httpclient klass vi tidigare sett, som WebClient och HttpWebRequest klasser, kan endast användas för förgrundsoperationer. När applikationen är avstängd, avbryts nätverksöverföringar.

När vi måste hantera stora dataöverföringar, tvingar användaren att hålla appen öppen öppnar inte den bästa användarupplevelsen. I detta scenario har Windows Phone 7.5 introducerat API för bakgrundsöverföring som kan användas för att starta en nedladdning eller uppladdning och fortsätta det även om appen är avstängd.

Det finns emellertid några begränsningar som har införts för att undvika batteriproblem och hög data planförbrukning:

  • Om telefonen är ansluten till ett mobilnät kan filer som är större än 20 MB inte hämtas.
  • Om telefonen är ansluten till ett Wi-Fi-nätverk kan filer som är större än 100 MB inte hämtas.
  • 100 MB-gränsen kan överskridas endast om telefonen är ansluten till ett Wi-Fi-nätverk och batteriet laddas.
  • En enda applikation kan köa upp till 25 bakgrundsöverföringsoperationer.
  • Det globala operativsystemets kö kan innehålla upp till 500 bakgrundsöverföringsoperationer.
  • Telefonen kan genomföra maximalt två överföringsoperationer i taget.

En bakgrundsöverföring identifieras av BackgroundTransferRequest klass, som är en del av Microsoft.Phone.BackgroundTransfer namnutrymmet. Som utvecklare har vi kontroll över vissa villkor som måste vara nöjda för en bakgrundsöverföring som skapats i vår ansökan för att starta, tack vare TransferPreferences egendom som kan få följande värden:

  • Ingen, standardvärdet: Överföringen startas endast om telefonen är ansluten till ett Wi-Fi-nätverk och batteriet laddas.
  • AllowBattery: Överföringen startas endast om telefonen är ansluten till ett Wi-Fi-nätverk, oberoende av strömkällan.
  • AllowCelullar: Överföringen startas endast om telefonen laddas, oberoende av nätverksanslutningen.

AllowCellularAndBattery: Börjar alltid överföringen, oberoende av anslutningen och strömkällans villkor.

De BackgroundTransferRequest klassen avslöjar två händelsehanterare som kan användas för att styra överföringen:

  • TransferStatusChanged utlöses när överföringsstatus ändras. Parametern som returneras med metoden innehåller a TransferStatus objekt som meddelar dig om den aktuella statusen (som Avslutad när överföringen slutar, eller pausad när överföringen är pausad). Det finns också specifika statuser som börjar med Väntar prefix som berättar när en överföring är avstängd eftersom villkoren definieras i TransferPreferences egendom är inte nöjd. Till exempel, WaitingForWiFi är inställd när överföringen väntar på att telefonen ska anslutas till ett Wi-Fi-nätverk för att starta.
  • TransferProgressChanged utlöses när en överförings framsteg ändras, vilket innebär att nya data har laddats ner eller laddats upp. Vanligtvis är denna händelsehanterare ansluten till a ProgressBar kontroll eftersom det avslöjar egenskaper för att meddela dig hur mycket data har överförts och hur mycket data som fortfarande behöver laddas ner eller skickas.

När du har definierat en bakgrundsöverföring måste du lägga till den i operativsystemets kö. Windows Phone tar hand om att starta det när de angivna villkoren är uppfyllda. För att uppnå denna uppgift använder vi BackgroundTransferService klass, som är den centrala chefen för bakgrundsöverföring. Du kan lägga till, ta bort eller lista bakgrundsöverföringar som hör till programmet.

I följande exempel kan du se en definition för bakgrundsöverföring:

privat BackgroundTransferRequest backgroundRequest; privat tomt OnStartBackgroundDownloadClicked (objekt avsändare, 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);  tom bakgrundRequest_TransferStatusChanged (objekt avsändare, BackgroundTransferEventArgs e) if (backgroundRequest.TransferStatus == TransferStatus.Completed) // Hantera den nedladdade filen. BackgroundTransferService.Remove (backgroundRequest); 

Vi registrerar denna överföring som ska utföras oavsett den tillgängliga nätverksanslutningen och strömkällan. Det föregående provet är relaterat till en hämtningsoperation, så vi måste definiera en källkod URI (filen som ska hämtas) och en destinations-URI (den lokala lagringsbanan där filen kommer att sparas). Till skillnad från vad vi har sett med Httpclient, vi behöver inte ta hand om sparandet filen hämtas automatiskt och sparas i det lokala lagret eftersom nedladdningen också kan slutföras när appen är avstängd. Både käll- och destinations-URI-adresser överförs som parametrar för BackgroundTransferRequest konstruktör.

Obs! Bakgrundsöverföringar som används för att utföra nedladdningsoperationer måste alltid spara filen i rutan Delade / Överföringar i lokal lagring, som automatiskt skapas när appen är installerad, annars får du ett undantag. När nedladdningen är klar kan du flytta filen till en annan position om det behövs, men du kan inte schemalägga en bakgrundsöverföring som försöker ladda ner en fil i en annan mapp.

Därefter prenumererar vi på TransferStatusChanged händelse. Om nedladdningen är klar medan appen är i förgrunden kan vi hantera den nedladdade filen, till exempel om det är en bild kan vi visa den. Lägg märke till Ta bort() operation som vi utför på BackgroundTransferService klass. Det är väldigt viktigt att alltid utföra denna uppgift eftersom operativsystemet automatiskt inte tar bort färdiga överföringar från programmets kö och det kan leda till oväntade problem eftersom en applikation inte kan schemalägga mer än 25 överföringar.

Istället, om du behöver ladda upp en fil måste du skapa en BackgroundTransferRequest objekt på ett annat sätt. Du behöver fortfarande definiera två URI: källan (filen som ska laddas upp) och destinationen (en tjänst som kan ta emot filen med hjälp av HTTP-kommandosatsen i Metod fast egendom). Destination URI kan skickas i BackgroundTransferRequestkonstruktör (som vi gjorde tidigare), men källan URI måste ställas in i UploadLocation egendom, som i följande prov:

privat tomt OnUploadFile () Uri destinationUrl = new 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 (begäran); 

Slutsats

I den här artikeln har vi sett hur du arbetar med en av de mest använda funktionerna i en smartphone: en Internetanslutning. I detalj har vi lärt oss:

  • Även om en Internetanslutning är en måste för varje enhet, bör vi vara medvetna om att ibland användare kanske inte har en tillgänglig anslutning. Det är viktigt att kontrollera om telefonen är ansluten till Internet innan du utför någon nätverksoperation.
  • Httpclient är en ny klass introducerad i Windows Runtime som hjälper till att utföra nätverksoperationer. Vi har sett hur du använder den för att ladda ner och ladda upp filer och interagera med tjänster.
  • Att ladda ner och ladda upp filer är en vanlig uppgift, men idag måste fler och fler applikationer interagera med webbtjänster för att få de data de behöver. I den här artikeln har vi lärt oss hur, tack vare JSON.NET-biblioteket, är det enkelt att arbeta med REST-tjänster och konvertera JSON-data till C # -objekt.
  • Httpclient är en bra hjälp, men det fungerar bara om applikationen är i förgrunden. När den är avstängd, avbryts nätverksoperationerna. I detta syfte erbjuder ramverket vissa specifika API: er för att utföra nedladdning och uppladdning, även i bakgrunden när appen inte används.

Denna handledning representerar ett kapitel från Windows Phone 8 Succinctly, en gratis eBook från laget vid Syncfusion.