2013-05-04 2 views
0

можно загрузить массив JSON в Windows 8 с помощью следующего кода:не удается загрузить JSon массива Windows Phone

aString = "http://website.com/image/image_manifest.json";

private async void GetJSON(string aString) 
     { 
      var client = new HttpClient(); 
      var lResponse = await client.GetStringAsync(aString); 
} 

Это работает 100%

Я пытаюсь сделать то же самое в Windows, телефон с этим

 private void GetJSON(string aNASAURL) 
     { 
      WebClient webClient = new WebClient(); 
      webClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(webClientHandler); 
       webClient.DownloadStringAsync(new Uri(aString)); 
} 
    private void webClientHandler(object sender, DownloadStringCompletedEventArgs e) 
     { 
      var lResponse = e.Result; 
} 

Это не работает, я получаю это исключение:

An exception of type 'System.Reflection.TargetInvocationException' occurred in System.ni.dll but was not handled in user code

Вдаваясь во внутреннее исключение, я вижу следующее:

InnerException {System.Net.WebException: The remote server returned an error: NotFound. ---> System.Net.WebException: The remote server returned an error: NotFound.

Полное исключение Ниже.

EDIT: Класс HttpClient недоступен для телефона Windows. Я выбрал WebClient в соответствии с предложением interwebs. Откройте для других вариантов. Метод ожидания не работает, и WebClient должен быть вызван Async. Я думаю, что это может иметь какое-то отношение к моему преобразованию строки в URI. К сожалению, URL-адрес еще не опубликован, но здесь есть аналогичная структура URL-адреса, например, строка.

отредактированный для ясности ......

> -  e {System.Net.DownloadStringCompletedEventArgs} System.Net.DownloadStringCompletedEventArgs 
+  base {System.Net.DownloadStringCompletedEventArgs} System.ComponentModel.AsyncCompletedEventArgs {System.Net.DownloadStringCompletedEventArgs} 
-  Result 'e.Result' threw an exception of type 'System.Reflection.TargetInvocationException' string {System.Reflection.TargetInvocationException} 
-  base {System.Reflection.TargetInvocationException: An exception occurred during the operation, making the result invalid. Check InnerException for exception details. ---> System.Net.WebException: The remote server returned an error: NotFound. ---> System.Net.WebException: The remote server returned an error: NotFound. 
    at System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult) 
    at System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClasse.<EndGetResponse>b__d(Object sendState) 
    at System.Net.Browser.AsyncHelper.<>c__DisplayClass1.<BeginOnUI>b__0(Object sendState) 
    --- End of inner exception stack trace --- 
    at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state) 
    at System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult asyncResult) 
    at System.Net.WebClient.GetWebResponse(WebRequest request, IAsyncResult result) 
    at System.Net.WebClient.DownloadBitsResponseCallback(IAsyncResult result) 
    --- End of inner exception stack trace --- 
    at System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary() 
    at System.Net.DownloadStringCompletedEventArgs.get_Result()} System.Exception {System.Reflection.TargetInvocationException} 
+  Data {System.Collections.ListDictionaryInternal} System.Collections.IDictionary {System.Collections.ListDictionaryInternal} 
     HelpLink null string 
     HResult -2146232828 int 
-  InnerException {System.Net.WebException: The remote server returned an error: NotFound. ---> System.Net.WebException: The remote server returned an error: NotFound. 
    at System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult) 
    at System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClasse.<EndGetResponse>b__d(Object sendState) 
    at System.Net.Browser.AsyncHelper.<>c__DisplayClass1.<BeginOnUI>b__0(Object sendState) 
    --- End of inner exception stack trace --- 
    at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state) 
    at System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult asyncResult) 
    at System.Net.WebClient.GetWebResponse(WebRequest request, IAsyncResult result) 
    at System.Net.WebClient.DownloadBitsResponseCallback(IAsyncResult result)} System.Exception {System.Net.WebException} 
+  [System.Net.WebException] {System.Net.WebException: The remote server returned an error: NotFound. ---> System.Net.WebException: The remote server returned an error: NotFound. 
    at System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult) 
    at System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClasse.<EndGetResponse>b__d(Object sendState) 
    at System.Net.Browser.AsyncHelper.<>c__DisplayClass1.<BeginOnUI>b__0(Object sendState) 
    --- End of inner exception stack trace --- 
    at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state) 
    at System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult asyncResult) 
    at System.Net.WebClient.GetWebResponse(WebRequest request, IAsyncResult result) 
    at System.Net.WebClient.DownloadBitsResponseCallback(IAsyncResult result)} System.Net.WebException 
+  Data {System.Collections.ListDictionaryInternal} System.Collections.IDictionary {System.Collections.ListDictionaryInternal} 
     HelpLink null string 
     HResult -2146233079 int 
-  InnerException {System.Net.WebException: The remote server returned an error: NotFound. 
    at System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult) 
    at System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClasse.<EndGetResponse>b__d(Object sendState) 
    at System.Net.Browser.AsyncHelper.<>c__DisplayClass1.<BeginOnUI>b__0(Object sendState)} System.Exception {System.Net.WebException} 
+  [System.Net.WebException] {System.Net.WebException: The remote server returned an error: NotFound. 
    at System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult) 
    at System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClasse.<EndGetResponse>b__d(Object sendState) 
    at System.Net.Browser.AsyncHelper.<>c__DisplayClass1.<BeginOnUI>b__0(Object sendState)} System.Net.WebException 
+  Data {System.Collections.ListDictionaryInternal} System.Collections.IDictionary {System.Collections.ListDictionaryInternal} 
     HelpLink null string 
     HResult -2146233079 int 
+  InnerException null System.Exception 
     Message "The remote server returned an error: NotFound." string 
     Source "System.Windows" string 
     StackTrace " at System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)\r\n at System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClasse.<EndGetResponse>b__d(Object sendState)\r\n at System.Net.Browser.AsyncHelper.<>c__DisplayClass1.<BeginOnUI>b__0(Object sendState)" string 
+  Static members  
+  Non-Public members  
     Message "The remote server returned an error: NotFound." string 
     Source "System.Windows" string 
     StackTrace " at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state)\r\n at System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)\r\n at System.Net.WebClient.GetWebResponse(WebRequest request, IAsyncResult result)\r\n at System.Net.WebClient.DownloadBitsResponseCallback(IAsyncResult result)" string 
+  Static members  
+  Non-Public members  
     Message "An exception occurred during the operation, making the result invalid. Check InnerException for exception details." string 
     Source "System" string 
     StackTrace " at System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary()\r\n at System.Net.DownloadStringCompletedEventArgs.get_Result()" string 
+  Static members  
+  Non-Public members  

ответ

1

Вы можете напишите функцию, подобную DownloadStringTaskAsync Предлагаемый Jon Skeet.

WebClient wc = new WebClient(); 
string result = await wc.DownloadAsync("http://www.stackoverflow.com"); 

public static partial class MyExtensions 
{ 
    public static Task<string> DownloadAsync(this WebClient wc, string url) 
    { 
     TaskCompletionSource<string> tcs = new TaskCompletionSource<string>(); 
     DownloadStringCompletedEventHandler completed = null; 

     completed = (s, e) => 
     { 
      try 
      { 
       tcs.SetResult(e.Result); 
      } 
      catch (Exception ex) 
      { 
       tcs.SetException(ex.InnerException ?? ex); 
      } 
      finally 
      { 
       wc.DownloadStringCompleted -= completed; 
      } 
     }; 

     wc.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12"; 
     wc.DownloadStringCompleted += completed; 
     wc.DownloadStringAsync(new Uri(url)); 

     return tcs.Task; 
    } 
} 
3

Вы должны использовать DownloadStringTaskAsync, а не DownloadStringAsync - в этот момент вы будете в состоянии ждать результата, хотя только в методе асинхронным. EDIT: Я думал, что это доступно на WP8, но, видимо, это не так.

Если вы хотите использовать HttpClient в приложении для Windows Phone, вы можете использовать пакет NuGet Microsoft.Net.Http.

(Вы может использование DownloadStringAsync, что «старый» способ использования WebClient, но тогда вы должны подписаться на соответствующие события вместо этого. Использования асинхр/ждешь гораздо чист.)

+0

Мой WebClient не имеет метод DownloadStringTaskAsync, что ты звонишь, что с? Редактировать: Я неправильно понял, что вы сказали. Ниже можно утверждать, что DownloadStringAsync не DownloadStringTaskAsync Я пробовал это. Хотя, это порождает ошибку. В нем говорится, что я не могу дождаться DownloadStringAsync, потому что он недействителен. Вы не можете ждать пустоты. Ошибка Не могу дождаться 'void' –

+1

@SeanDunford: Я не сказал, чтобы ждать DownloadStringAsync - я сказал, чтобы ждать DownloadStringTaskAsync. Это разные методы. –

+0

смотрите выше. –

Смежные вопросы