2012-12-13 6 views
1

J'essaie d'écrire une bibliothèque pour Windows Phone 8 et je voudrais savoir s'il est possible de consommer JSON sans utiliser les rappels en utilisant le mot-clé await? Ou est-ce que je me trompe sur comment cela fonctionne?Windows Phone 8 Async JSON avec AWAIT

Essentiellement, je veux l'application pour pouvoir dire:

string result = Library.Ping(var1, var2); 

La bibliothèque se connecte au service Web et désérialise le contenu de JSON à un objet dynamique. Ensuite, il le renvoie à l'application principale qui a envoyé la demande à la bibliothèque.

Répondre

6

Voir pour la réponse liée au cas où le site se couche:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Net; 
using System.Text; 
using System.Threading.Tasks; 
using System.ComponentModel; 

namespace Win8WinPhone.CodeShare.Extensions 
{ 
    public static class HttpExtensions 
    { 
     public static Task<Stream> GetRequestStreamAsync(this HttpWebRequest request) 
     { 
      var taskComplete = new TaskCompletionSource<Stream>(); 
      request.BeginGetRequestStream(ar => 
      { 
       Stream requestStream = request.EndGetRequestStream(ar); 
       taskComplete.TrySetResult(requestStream); 
      }, request); 
      return taskComplete.Task; 
     } 

     public static Task<HttpWebResponse> GetResponseAsync(this HttpWebRequest request) 
     { 
      var taskComplete = new TaskCompletionSource<HttpWebResponse>(); 
      request.BeginGetResponse(asyncResponse => 
      { 
       try 
       { 
        HttpWebRequest responseRequest = (HttpWebRequest)asyncResponse.AsyncState; 
        HttpWebResponse someResponse = (HttpWebResponse)responseRequest.EndGetResponse(asyncResponse); 
        taskComplete.TrySetResult(someResponse); 
       } 
       catch (WebException webExc) 
       { 
        HttpWebResponse failedResponse = (HttpWebResponse)webExc.Response; 
        taskComplete.TrySetResult(failedResponse); 
       } 
      }, request); 
      return taskComplete.Task; 
     } 
    } 

    public static class HttpMethod 
    { 
     public static string Head { get{return "HEAD";} } 
     public static string Post { get{return "POST";} } 
     public static string Put { get{return "PUT";} } 
     public static string Get { get{return "GET";} } 
     public static string Delete { get{return "DELETE";} } 
     public static string Trace { get{return "TRACE";} } 
     public static string Options { get{return "OPTIONS";} } 
     public static string Connect { get{return "CONNECT";} } 
     public static string Patch { get{return "PATCH";} } 
    } 

} 

Ensuite, vous pouvez écrire votre fonction:

public async Task<string> GetMyData(string urlToCall) 
{ 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlToCall); 
    request.Method = HttpMethod.Get; 
    HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync(); 
    using (var sr = new StreamReader(response.GetResponseStream())) 
    { 
     return sr.ReadToEnd(); 
    } 
} 

Et puis appelez-le comme:

Tweet myTweet = await GetTweet(tweetID); 

Tout le crédit va à: @robertftw qui lié à: http://www.windowsphonegeek.com/news/windows-8---windows-phone-code-sharing-httpwebrequest-getresponseasync

+0

Vous pouvez également installer le package HttpClient portable pré-version maintenant. Ensuite, vous pouvez utiliser le HttpClient native pour l'async. – kamranicus

+0

@subkamran - Lien à télécharger? –

+0

@Robert Oschler https://www.nuget.org/packages/Microsoft.Net.Http –

3

Vous pouvez être très proche de cela. Ce que vous finiriez avec est:

string result = await Library.PingAsync(var1, var2); 

Tout d'abord, installez Microsoft.Bcl.Async. Votre Library.PingAsync aurait ce genre de structure:

public static async Task<string> PingAsync(MyType1 var1, MyType2 var2) 
{ 
    var client = new WebClient(); 
    var stringResult = client.DownloadStringTaskAsync(..); 
    return JSON.Parse(stringResult).Whatever; 
} 
+0

HttpClient est pas pris en charge sur Windows Phone 8 pour autant que je peux dire. D'autres idées? –

+3

WebClient ou peut-être HttpWebRequest. http://www.windowsphonegeek.com/news/windows-8---windows-phone-code-sharing-httpwebrequest-getresponseasync – robertk

+0

Voir la mise à jour de la réponse. –