Windows Phone 8 Succinct Rețeaua de acces la date

Verificarea conexiunii la Internet

Toate dispozitivele Windows Phone au o conexiune de rețea încorporată, dar, din același motiv, am învățat cum să stocăm date la nivel local, trebuie să fim gata să gestionăm modul în care utilizatorii folosesc aplicația noastră în timp ce lipsește o conexiune.

În acest scop, cadrul Windows Phone include o clasă care poate fi utilizată pentru a descoperi informații despre conexiunea la Internet numită DeviceNetworkInformation, care face parte din Microsoft.Phone.Net.NetworkInformation Spațiu de nume.

Cel mai important este IsNetworkAvailable, care ne spune dacă este disponibilă o conexiune la Internet. Ar trebui să folosim întotdeauna acest API înainte de a efectua o operațiune care necesită o conexiune, cum ar fi următorul exemplu:

private void OnCheckConnectionClicked (expeditor obiect, RoutedEventArgs e) if (DeviceNetworkInformation.IsNetworkAvailable) MessageBox.Show ("Sunteți conectat la Internet"); // Efectuați operațiuni de rețea.  altceva MessageBox.Show ("Nu sunteți conectat la Internet"); 

De asemenea, clasa oferă un eveniment numit NetworkAvailabilityChanged care este declanșată de fiecare dată când se schimbă starea conexiunii. Este util dacă doriți să reacționați rapid la modificările de rețea, cum ar fi activarea sau dezactivarea anumitor caracteristici ale aplicației.

public MainPage () InitializeComponent (); DeviceNetworkInformation.NetworkAvailabilityChanged + = DeviceNetworkInformation_NetworkAvailabilityChanged;  private void DeviceNetworkInformation_NetworkAvailabilityChanged (expeditor obiect, NetworkNotificationEventArgs e) if (e.NotificationType ==NetworkNotificationType.InterfaceDisconnected) MessageBox.Show ("Deconectat");  altfel dacă (e.NotificationType == NetworkNotificationType.InterfaceConnected) MessageBox.Show ("Connected"); 

Parametrii returnării conțin o proprietate numită NotificationType, de tipul NetworkNotificationType, care ne indică starea actuală a rețelei.

Cu toate acestea, cu DeviceNetworkInformation veți putea obține și alte informații despre starea actuală a rețelei, cum ar fi dacă utilizatorul a activat conexiunea de date celulară (IsCellularDataEnabled), conexiunea Wi-Fi (IsWiFiEnabled) sau opțiuni de roaming (IsCellularDataRoamingOptions).

Cadrul oferă o altă clasă utilă pentru a face față conexiunilor de rețea numite Interfata retea. Prin utilizarea funcției NetworkInterfaceType proprietate, veți putea identifica tipul de conexiune utilizat în prezent. De exemplu, putem folosi această proprietate pentru a evita descărcarea fișierelor mari în timp ce utilizați o conexiune celulară.

NetworkInterfaceType este un enumerator care poate asuma multe valori. Cele mai importante sunt:

  • MobileBroadbandGsm și MobileBroadbandCdma când telefonul este conectat la o rețea celulară (GSM sau CDMA, în funcție de țară)
  • Wireless80211, când telefonul este conectat la o rețea Wi-Fi

În următorul exemplu, afișăm un mesaj pe ecran cu tipul de conexiune curent:

privat void OnCheckConnectionTypeClicked (expeditor obiect, RoutedEventArgs e) if (NetworkInterface.NetworkInterfaceType == NetworkInterfaceType.MobileBroadbandGsm || RețeaInterface.NetworkInterfaceType == NetworkInterfaceType.MobileBroadbandCdma) MessageBox.Show ("Mobile");  altfel dacă (NetworkInterface.NetworkInterfaceType == NetworkInterfaceType.Wireless80211) MessageBox.Show ("Wi-Fi"); 

Efectuarea operațiunilor de rețea: HttpClient

Cadrul Windows Phone are două clase încorporate pentru efectuarea operațiilor de rețea: WebClient și HttpWebRequest. Din păcate, nici una dintre ele nu este perfectă. WebClient este foarte usor de folosit, dar se bazeaza pe vechea abordare callback (daca nu instalati Async pentru .NET pachet discutat mai devreme în această serie). HttpWebRequest este foarte puternic, dar este complex de utilizat și bazat pe un model vechi asincron greu de înțeles.

Runtime-ul Windows a introdus o nouă clasă numită httpclient, care ia cele mai bune din ambele lumi. Este puternic și oferă o performanță excelentă, dar este ușor de utilizat și oferă metode care se bazează pe noul asincron și așteaptă modelul. Această clasă este disponibilă în aplicațiile Windows Runtime pentru aplicațiile Windows Store, dar nu este inclusă în subsetul Windows Phone Runtime - va trebui să o instalați de la NuGet.

httpclient clasa, după cum vom vedea mai târziu, este excelentă nu numai pentru efectuarea unor operații de rețea generică cum ar fi descărcarea și încărcarea fișierelor, dar și pentru interacțiunea cu serviciile web. De fapt, acesta expune metodele asincrone pentru fiecare comandă HTTP, cum ar fi GET, POST, PUT, etc.

Notă: Pentru a putea interacționa cu rețeaua, va trebui să activați opțiunea ID_CAP_NETWORKING din fișierul manifest. Este activat în fiecare nouă lucrare Windows Phone în mod implicit.

Descărcarea datelor

Fișierele sunt descărcate de obicei utilizând comanda GET HTTP, deci httpclient oferă GetAsync () metodă. Pentru a simplifica viața dezvoltatorilor, httpclient are unele metode încorporate pentru a descărca cele mai comune tipuri de fișiere, cum ar fi GetStringAsync () pentru descărcarea de fișiere text cum ar fi răspunsurile XML, RSS sau REST; sau GetByteArrayAsync () și GetStreamAsync () pentru a obține conținutul fișierului binar.

Descărcarea șirurilor este foarte ușoară. Metoda GetStringAsync () cere ca parametru URL-ul fișierului și returnează conținutul fișierului ca un șir. În următorul exemplu, puteți vedea cum să descărcați feedul RSS al blogului meu:

privat async void OnDownloadStringClicked (expeditor obiect, RoutedEventArgs e) HttpClient client = nou HttpClient (); string rezultat = așteptați client.GetStringAsync ("http://feeds.feedburner.com/qmatteoq_eng"); 

După ce ai șirul, poți efectua operațiile necesare în funcție de scenariul tău. De exemplu, în proba anterioară am putut analiza XML returnat cu LINQ în XML pentru a afișa lista de știri pe ecran.

Descărcarea fișierelor binare poate fi realizată în mai multe moduri. Poți să folosești GetByteArrayAsync () dacă preferați să lucrați cu octeți, sau GetStreamAsync () dacă preferați să manipulați conținutul fișierului ca flux.

În următorul exemplu, veți vedea cum să descărcați o imagine utilizând GetByteArrayAsync () metodă. Returnează o matrice de octeți, care poate fi ușor salvată în spațiul de stocare local utilizând API-urile pe care le-am învățat mai devreme în această serie.

privat async void OnDownloadFileClicked (expeditor obiect, RoutedEventArgs e) HttpClient client = nou HttpClient (); byte [] octeți = așteptați client.GetByteArrayAsync ("http://www.syncfusion.com/Content/en-US/Home/Images/syncfusion-logo.png"); StorageFile storageFile = așteaptă ApplicationData.Current.LocalFolder.CreateFileAsync ("picture.png", CreationCollisionOption.ReplaceExisting); IRandomAccessStream accessStream = așteptați storageFile.OpenAsync (FileAccessMode.ReadWrite); folosind (IOutputStream outputStream = accessStream.GetOutputStreamAt (0)) scriitorul DataWriter = noul DataWriter (outputStream); writer.WriteBytes (bytes); așteaptă scriitor.StoreAsync (); 

Prin utilizarea funcției DataWriter , putem salva matricea de octeți returnată de httpclient clasați într-un fișier din spațiul de stocare local numit picture.png.

Dacă aveți nevoie de control complet asupra operației de descărcare, puteți utiliza genericul GetAsync () , care returnează a HttpResponseMessage obiect cu întregul conținut al răspunsului, cum ar fi anteturile, codul de stare etc..

În exemplul următor puteți vedea cum, utilizând GetAsync () , putem descărca o imagine ca o Curent și afișați-o într-un Imagine control plasat pe pagină. Pentru metoda trecem un al doilea parametru de tip HttpCompletionOption, care spune clasa când să marcheze operația ca fiind finalizată. Deoarece vrem conținutul complet al răspunsului (care este imaginea descărcată), vom folosi ResponseContentRead opțiune.

privat async void OnDownloadStreamClicked (expeditor obiect, RoutedEventArgs e) HttpClient client = nou HttpClient (); HttpResponseMessage httpResponseMessage = așteptați client.GetAsync ("http://www.syncfusion.com/Content/en-US/Home/Images/syncfusion-logo.png", HttpCompletionOption.ResponseContentRead); Stream stream = așteaptă httpResponseMessage.Content.ReadAsStreamAsync (); BitmapImage image = nou BitmapImage (); image.SetSource (flux); Logo.Source = imagine; 

Observați că metodele specifice pe care le-am văzut oferite de httpclient clasa sunt pur și simplu o scurtătură pentru metodele oferite de Conţinut proprietate a HttpResponseMessage clasa (în eșantionul anterior, vom folosi ReadAsStreamAsync () metodă pentru a returna conținutul răspunsului ca a Curent).

Încărcarea datelor

Încărcarea datelor se realizează într-un mod similar: operația este de obicei efectuată utilizând comanda POST, astfel încât httpclient clasa expune PostAsync () în acest scop.

Conținutul de trimis este pregătit folosind HttpContent clasa, care oferă multe implementări: StreamContent pentru a trimite fluxul unui fișier, ByteArrayContent pentru a trimite un fișier binar, StringContent pentru a trimite un șir, sau MultipartFormDataContent pentru a trimite conținutul codificat folosind tipul MIME multipart / form-data.

În următorul exemplu, puteți vedea cum să încărcați fluxul unui fișier unui serviciu:

privat async void OnUploadFileClicked (expeditor obiect, RoutedEventArgs e) StorageFile storageFile = așteaptă ApplicationData.Current.LocalFolder.GetFileAsync ("picture.png"); IRandomAccessStream accessStream = așteptați storageFile.OpenAsync (FileAccessMode.ReadWrite); Clientul HttpClient = noul HttpClient (); Conținutul HttpContent = nou StreamContent (accessStream.AsStreamForRead ()); așteptați client.PostAsync ("http://wp8test.azurewebsites.net/api/values", conținut); 

După ce am preluat fluxul unui fișier stocat în spațiul de stocare local, îl transmitem unei noi instanțe din StreamContent clasă. Apoi, numim PostAsync () , trecând adresa URL a serviciului și HttpContent obiect ca parametri.

Utilizarea serviciilor REST

REST (Transfer de stat reprezentativ) este, fără îndoială, cea mai utilizată abordare în zilele noastre în dezvoltarea serviciilor web, în ​​special în lumea mobilă.

Serviciile REST au devenit foarte populare din două motive:

  • Ele se bazează pe protocolul HTTP și expun operațiunile utilizând comenzile HTTP standard (cum ar fi GET, POST, PUT etc.).
  • Ei returnează date utilizând limbi standard cum ar fi XML și JSON.

Aproape fiecare platformă suportă în mod nativ aceste tehnologii, deci nu trebuie să căutați biblioteci speciale pentru a interacționa cu ele, așa cum este necesar pentru serviciile web bazate pe WSDL.

Am văzut deja cum, cu httpclient clasă, este simplu să interacționați cu webul utilizând comenzile HTTP standard. De cele mai multe ori, pentru a interacționa cu un serviciu REST, va trebui pur și simplu să executați GetStringAsync () pentru a obține răspunsul XML sau JSON.

Odată ce ați obținut rezultatul, de cele mai multe ori va trebui să îl convertiți în obiecte care vor fi folosite în interiorul aplicației. La începutul acestei serii, am discutat despre cea mai ușoară cale de a îndeplini această sarcină: deserializarea, ceea ce înseamnă traducerea textului simplu în obiecte complexe. Putem folosi DataContractSerializer sau DataContractJsonSerializer pentru a face acest lucru. În acest caz, trebuie doar să vă referiți la procesul de deserializare, deoarece procedura este aceeași.

privat async void OnConsumeServiceClicked (expeditor obiect, RoutedEventArgs e) HttpClient client = nou HttpClient (); string rezultat = așteptați client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values"); folosind (MemoryStream ms = nou MemoryStream (Encoding.Unicode.GetBytes (rezultat))) DataContractJsonSerializer serializer = nou DataContractJsonSerializer (typeof (List)); Listă people = serializer.ReadObject (ms) ca List; 

Presupunem că serviciul returnează, în format JSON, o listă de persoane:

"id": 1, "nume": "Matteo", "nume": "Pagani", "id":

Cu ajutorul DataContractJsonSerializer , putem converti JSON - ul precedent într - o listă de Persoană obiecte, care este aceeași clasă pe care am folosit-o în multe alte mostre din această serie. Diferența în acest exemplu este că putem controla procesul de serializare, în cazul în care, de exemplu, numele proprietăților returnate din JSON sunt diferite de cele pe care le folosim în clasele noastre. Acesta este un scenariu foarte comun atunci când se ocupă cu JSON, deoarece proprietățile sunt de obicei minuscule, în timp ce în obiectele C # ele sunt CamelCase. Acest rezultat este obținut prin utilizarea funcției [DataMember] atribut, care poate fi aplicat proprietatilor pe care dorim sa le serializam. În exemplul următor, puteți vedea că atributul oferă o proprietate numită Nume, care pot fi folosite pentru a specifica care nume de proprietate așteptăm să găsim în fișierul JSON.

clasa publica Persoana [DataMember (Name = "id")] public int Id get; a stabilit;  [DataMember (Name = "nume")] șir public Nume get; a stabilit;  [DataMember (Nume = "nume")] șir public Prenume get; a stabilit; 

Această abordare are un dezavantaj: serviciile REST întoarce întotdeauna un șir simplu, în timp ce DataContractJsonSerializer clasa necesită o Curent ca parametru de intrare al ReadObject () metodă, deci suntem întotdeauna forțați să o convertim folosind a MemoryStream obiect.

Există un alt mod de a realiza același rezultat. Permiteți-mi să vă prezint JSON.NET, o bibliotecă terță parte care oferă câteva caracteristici suplimentare pentru manipularea datelor JSON. În plus, oferă performanțe mai bune și este capabil să deserializeze mai repede fișiere complexe JSON.

Acesta poate fi ușor instalat utilizând NuGet, iar site-ul său oficial oferă comparații cu alte biblioteci JSON și documentație detaliată.

În următorul exemplu, folosim JSON.NET pentru a obține același rezultat ca și codul pe care l-am utilizat anterior:

privat async void OnGetDataClicked (expeditor obiect, RoutedEventArgs e) HttpClient client = nou HttpClient (); string rezultat = așteptați client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values"); Listă people = JsonConvert.DeserializeObject> (Rezultat); 

JsonConvert clasa (care face parte din Newtonsoft.Json spațiul de nume) expune DeserializeObject() metoda, unde T este tipul de obiect pe care îl așteptăm în schimb. Ca parametru de intrare, acesta necesită numai șirul JSON pe care l-am descărcat de la serviciu.

De asemenea, este posibil să controlați procesul de deserializare utilizând atribute, așa cum am făcut anterior cu DataMember atribut. În următorul exemplu, puteți vedea cum putem defini cum trebuie proprietățile JSON să fie traduse:

clasa publică Persoana [JsonProperty ("id")] public int Id get; a stabilit;  [JsonProperty ("name")] șir public Nume get; a stabilit;  [JsonProperty ("nume de familie")] șirul public Prenume get; a stabilit; 

Sfat: Va trebui să utilizați adesea servicii de la terțe părți, astfel încât să nu știți maparea exactă între entități și date JSON. Există un site web care vă va ajuta în acest scenariu: http://json2csharp.com/. Pur și simplu inserați JSON returnat de serviciul dvs. și va genera pentru dvs. clasele C # necesare pentru a cartografia datele JSON. 

LINQ către JSON

O altă caracteristică interesantă introdusă de JSON.NET este LINQ to JSON, care este un limbaj bazat pe LINQ care, similar LINQ cu XML, poate fi folosit pentru a manipula un șir JSON pentru a extrage doar informațiile de care aveți nevoie. Această abordare este utilă atunci când nu aveți nevoie să utilizați deserializarea, dar trebuie doar să extrageți câteva date din răspunsul JSON pe care l-ați primit de la serviciu.

Punctul de plecare pentru a utiliza LINQ pentru JSON este JObject clasă, care identifică un fișier JSON. Pentru a începe să lucrați cu el, pur și simplu trebuie să apelați Analiza() metode, trecând ca parametru șirul JSON, așa cum se arată în următorul exemplu:

privat async void OnParseJson (expeditor obiect, RoutedEventArgs e) client HttpClient = nou HttpClient (); string rezultat = așteptați client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values"); JObject json = JObject.Parse (rezultat); 

Acum sunteți gata să executați anumite operațiuni. Să aruncăm o privire la cele mai obișnuite.

Simplu JSON

Iată un exemplu de fișier simplu JSON:

"Id": 1, "Nume": "Matteo", "Prenume": "Pagani"

Cu LINQ către JSON, putem extrage valoarea unei singure proprietăți în felul următor:

privat async void OnParseJson (expeditor obiect, RoutedEventArgs e) client HttpClient = nou HttpClient (); string rezultat = așteptați client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values/1"); JObject json = JObject.Parse (rezultat); string value = json ["Nume"] Valoare(); 

JObject clasa este tratată ca o colecție, astfel încât să puteți accesa pur și simplu o proprietate folosind numele său ca o cheie. În final, puteți extrage valoarea folosind Valoare() metoda, unde T este tipul de date pe care așteptăm să îl stocăm.

Complexul JSON

Ca obiecte C #, obiectele JSON pot avea, de asemenea, proprietăți complexe, așa cum se arată în următorul exemplu:

"Id": 1, "Nume": "Matteo", "Prenume": "Pagani", "Adresa": "Strada": "Milan"

Adresa este o proprietate complexă deoarece conține alte proprietăți imbricate. Pentru a accesa aceste proprietăți, trebuie să folosim SelectToken () , trecând calea completă JSON ca parametru:

privat async void OnParseJson (expeditor obiect, RoutedEventArgs e) client HttpClient = nou HttpClient (); string rezultat = așteptați client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values/1"); JObject json = JObject.Parse (rezultat); string oraș = json.SelectToken ("Adresa.City") Valoare(); 

Cu Address.City cale, putem extrage valoarea Oraș proprietate care face parte din Adresa nodul.

JSON Colecții

Când gestionați colecțiile JSON, puteți utiliza funcția Copii () pentru a obține acces la toate nodurile pentru copii ale unei proprietăți specifice. Să utilizăm, de exemplu, un cod JSON pe care l-am văzut anterior:

"Id": 1, "Nume": "Matteo", "Prenume": "Pagani", "Id": 2, "Nume": "John";

În acest caz, putem folosi JArray clasa și Copii () metoda de extragere a tuturor elementelor colecției. În exemplul următor puteți vedea cum îl folosim pentru a obține o subcolulare cu numai Nume valorile proprietății.

privat async void OnGetDataClicked (expeditor obiect, RoutedEventArgs e) HttpClient client = nou HttpClient (); string rezultat = așteptați client.GetStringAsync ("http://wp8test.azurewebsites.net/api/values"); JArray json = JArray.Parse (rezultat); Listă (x => x ["Name"])()).A lista(); 

Transferuri de fond

httpclient clasa pe care am văzut-o anterior, cum ar fi WebClient și HttpWebRequest clase, pot fi utilizate numai pentru operațiunile primare. Când aplicația este suspendată, transferurile de rețea sunt anulate.

Când avem de-a face cu transferurile de date mari, forțând utilizatorul să păstreze aplicația deschisă, nu creează cea mai bună experiență a utilizatorului. Pentru acest scenariu, Windows Phone 7.5 a introdus API-uri de transfer de fundal care pot fi utilizate pentru a începe o operație de descărcare sau încărcare și pentru a continua, chiar dacă aplicația este suspendată.

Cu toate acestea, există câteva limitări care au fost introduse pentru a evita problemele legate de baterii și un consum ridicat de planuri de date:

  • Dacă telefonul este conectat la o rețea celulară, fișierele mai mari de 20 MB nu pot fi descărcate.
  • Dacă telefonul este conectat la o rețea Wi-Fi, fișierele mai mari de 100 MB nu pot fi descărcate.
  • Limita de 100 MB poate fi depășită numai dacă telefonul este conectat la o rețea Wi-Fi și bateria se încarcă.
  • O singură aplicație poate să cozi până la 25 de operațiuni de transfer de fundal.
  • Coada de operare globală poate conține până la 500 de operații de transfer de fundal.
  • Telefonul poate executa simultan maximum două operațiuni de transfer.

Un transfer de fond este identificat de către BackgroundTransferRequest clasa, care face parte din Microsoft.Phone.BackgroundTransfer Spațiu de nume. În calitate de dezvoltatori, avem controlul asupra anumitor condiții care trebuie îndeplinite pentru un transfer de fundal creat în cererea noastră de a începe, datorită TransferPreferences proprietate care poate obține următoarele valori:

  • Nici unul, valoarea implicită: Transferul este pornit numai dacă telefonul este conectat la o rețea Wi-Fi și bateria se încarcă.
  • AllowBattery: Transferul este pornit numai dacă telefonul este conectat la o rețea Wi-Fi, indiferent de sursa de alimentare.
  • AllowCelullar: Transferul este pornit numai dacă telefonul se încarcă, indiferent de conexiunea la rețea.

AllowCellularAndBattery: Începe întotdeauna transferul, indiferent de condițiile de conectare și sursă de alimentare.

BackgroundTransferRequest clasa expune doi operatori care pot fi utilizați pentru a controla transferul:

  • TransferStatusChanged este declanșată când se schimbă starea transferului. Parametrul returnat de metodă conține a TransferStatus obiect care vă anunță starea curentă (cum ar fi terminat când se încheie transferul, sau Întrerupt când transferul este întrerupt). Există, de asemenea, stări specifice care încep cu Aşteptare prefixul care vă spune când un transfer este suspendat din cauza condițiilor definite în secțiunea TransferPreferences bunurile nu sunt îndeplinite. De exemplu, WaitingForWiFi este setat când transferul așteaptă ca telefonul să fie conectat la o rețea Wi-Fi pentru a porni.
  • TransferProgressChanged este declanșată atunci când se schimbă progresul unui transfer, ceea ce înseamnă că au fost descărcate sau încărcate date noi. De obicei, acest handler de evenimente este conectat la un a Bara de progres control, deoarece expune proprietăți pentru a vă anunța cât de mult au fost transferate datele și cât de mult trebuie să descărcați sau să trimiteți date.

După ce ați definit un transfer de fundal, trebuie să îl adăugați în coada de așteptare a sistemului de operare. Windows Phone va avea grijă să-l pornească atunci când sunt îndeplinite condițiile specificate. Pentru a îndeplini această sarcină, folosim BackgroundTransferService clasa, care este managerul central de transfer de fundal. Puteți adăuga, elimina sau lista de transferuri de fond care aparțin aplicației.

În următorul exemplu puteți vedea o definiție a transferului de fond:

privat BackgroundTransferRequest backgroundRequest; privat void OnStartBackgroundDownloadClicked (expeditor obiect, RoutedEventArgs e) Uri sourceUrl = nou Uri ("http://wpsauce.com/wp-content/uploads/2011/11/windows_phone_logo.jpg"); Uri destinationUrl = nou Uri ("/ Shared / Transfers / windows_phone_logo.jpg", UriKind.RelativeOrAbsolute); backgroundRequest = BackgroundTransferRequest nou (sourceUrl, destinationUrl); backgroundRequest.TransferStatusChanged + = backgroundRequest_TransferStatusChanged; backgroundRequest.TransferPreferences = TransferPreferences.AllowCellularAndBattery; BackgroundTransferService.Add (backgroundRequest);  void backgroundRequest_TransferStatusChanged (sender de obiecte, BackgroundTransferEventArgs e) if (backgroundRequest.TransferStatus == TransferStatus.Completed) // Gestionați fișierul descărcat. BackgroundTransferService.Remove (backgroundRequest); 

Înregistram acest transfer care trebuie executat indiferent de conexiunea de rețea disponibilă și de sursa de alimentare. Eșantionul anterior este legat de o operație de descărcare, deci trebuie să definim un URI sursă (fișierul de descărcat) și un URI de destinație (calea de stocare locală în care fișierul va fi salvat). Spre deosebire de ceea ce am văzut cu httpclient, nu trebuie să avem grijă de procesul de salvare; fișierul va fi descărcat și salvat automat în spațiul de stocare local, deoarece descărcarea poate fi terminată și când aplicația este suspendată. Atât URI-urile sursă, cât și cele de destinație sunt transferate ca parametri ai BackgroundTransferRequest constructor.

Notă: transferurile de fond care sunt utilizate pentru a efectua operațiile de descărcare trebuie să salveze fișierul în interiorul căii partajate / transferurilor din spațiul de stocare local, care este creat automat când aplicația este instalată - altfel veți obține o excepție. După terminarea descărcării, puteți să mutați fișierul într-o altă poziție dacă este necesar, dar nu puteți programa un transfer de fundal care încearcă să descarce un fișier într-un alt folder.

Apoi, ne abonați la TransferStatusChanged eveniment. Dacă descărcarea este finalizată în timp ce aplicația se află în prim-plan, putem gestiona fișierul descărcat - de exemplu, dacă este o imagine, îl putem afișa. Observați Elimina() pe care le efectuăm pe BackgroundTransferService clasă. Este foarte important să efectuați întotdeauna această sarcină, deoarece sistemul de operare nu va elimina automat transferurile finalizate din coada aplicației și poate duce la probleme neașteptate, deoarece o aplicație nu poate programa mai mult de 25 de transferuri.

În schimb, dacă trebuie să încărcați un fișier, va trebui să creați un fișier BackgroundTransferRequest obiecte într-un mod diferit. Totuși, trebuie să definiți două URI-uri: sursa (fișierul de încărcat) și destinația (un serviciu care poate recepționa fișierul utilizând setul de comandă HTTP din Metodă proprietate). URI destinație poate fi trecut în BackgroundTransferRequest(cum am făcut anterior), dar trebuie să fie setat URI-ul sursă în UploadLocation proprietății, ca în următorul exemplu:

void privat OnUploadFile () Uri destinationUrl = nou Uri ("http://wp8test.azurewebsites.com/api/values", UriKind.Relative); Uri sourceUri = nou Uri ("/ Shared / Transfers / image.png", UriKind.Relative); Cerere BackgroundTransferRequest = BackgroundTransferRequest nou (destinationUrl); request.UploadLocation = sourceUri; request.Method = "POST"; BackgroundTransferService.Add (cerere); 

Concluzie

În acest articol am văzut cum să lucrăm cu una dintre cele mai utilizate caracteristici ale unui smartphone: o conexiune la Internet. În detaliu, am învățat:

  • Chiar dacă o conexiune la Internet este o necesitate pentru fiecare dispozitiv, ar trebui să fim conștienți de faptul că uneori utilizatorii ar putea să nu aibă o conexiune disponibilă. Este important să verificați dacă telefonul este conectat la Internet înainte de a efectua orice operațiune de rețea.
  • httpclient este o nouă clasă introdusă în Windows Runtime care ajută la efectuarea operațiilor de rețea. Am văzut cum să îl folosim pentru descărcarea și încărcarea fișierelor și pentru interacțiunea cu serviciile.
  • Descărcarea și încărcarea fișierelor este o sarcină obișnuită, dar în prezent, din ce în ce mai multe aplicații trebuie să interacționeze cu serviciile web pentru a obține datele de care au nevoie. În acest articol am învățat cum, datorită bibliotecii JSON.NET, este ușor să lucrați cu serviciile REST și să convertiți datele JSON în obiecte C #.
  • httpclient este un mare ajutor, dar funcționează numai dacă aplicația se află în prim-plan. Când este suspendată, operațiile de rețea sunt anulate. În acest scop, cadrul oferă anumite API-uri specifice pentru a efectua operații de descărcare și încărcare chiar și în fundal atunci când aplicația nu este utilizată.

Acest tutorial reprezintă un capitol din Windows Phone 8 Succinctly, un eBook gratuit de la echipa de la Syncfusion.

Cod