2013-03-04 3 views
0

Я уже некоторое время борется, но я просто не могу получить эту работу. Я пытаюсь загрузить json-строку в мое приложение Windows Phone 8, используя «вид» async ждут.Cant получить Async (async wait) загрузить JSON для работы

Я использую the promising solution of Matthias Shapiro.

HttpExtensions.cs

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"; } } 
} 

И Мои MainPageViewModel.cs

protected override void OnActivate() 
    { 
     base.OnActivate(); 
     GetSessions(); 
    } 

    private async void GetSessions() 
    { 
     var result = await GetMyData("http://localhost/api/MyData"); 
    } 

    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(); 
     } 
    } 

После того, как он попадает в "HttpWebResponse someResponse = (HttpWebResponse) responseRequest.EndGetResponse (asyncResponse)", я получаю a WebException:

«System.Net.WebException: удаленный сервер возвратил ошибку: NotFound»

Когда я погружаюсь немного глубже, я замечаю, что эта ошибка не является фактической ошибкой. Когда я проверяю «asyncResponse» внутри метода GetResponseAsync в классе HttpExtensions я замечаю ошибку:

«AsyncWaitHandle =„asyncResponse.AsyncWaitHandle“бросил исключение типа" System.NotSupportedException»

у меня нет Идея, как получить эту работу. Я что-то делаю неправильно?

+0

Странно, я использую то же самое и его работоспособность для меня. Вы импортировали эту ссылку http://nuget.org/packages/Microsoft.Bcl.Async? – robertk

+0

Я пробовал это с этим пакетом или без него, но оба возвращают мне ту же ошибку ... Когда я пытаюсь сделать это с помощью онлайн-URL, он работает «иногда» ... Это как-то связано с попыткой его на местном уровне? I Когда я проверяю URL-адрес с помощью FireFox, я получаю результат, который я ожидаю ... Это так странно ... –

+4

Я вижу проблему сейчас. Поскольку эмулятор использует виртуальную машину, вы не можете использовать localhost, потому что localhsot - это телефон, а не ваш компьютер. Посмотрите это решение: http://stackoverflow.com/questions/13149304/windows-phone-8-emulator-access-localhost – robertk

ответ

1

Я вижу проблему сейчас. Поскольку эмулятор использует виртуальную машину, вы не можете использовать localhost, потому что localhost - это телефон, а не ваш компьютер. См. Это решение: Windows Phone 8 Emulator: Access localhost