0

我可以使用以下代码在 Windows 8 中下载 Json 数组:

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

这不起作用,我收到此异常:

System.ni.dll 中出现“System.Reflection.TargetInvocationException”类型的异常,但未在用户代码中处理

进入内部异常,我看到了这个:

InnerException {System.Net.WebException:远程服务器返回错误:NotFound。---> System.Net.WebException:远程服务器返回错误:NotFound。

下面的完整例外。

编辑: HttpClient 类不适用于 windows phone。我根据interwebs的建议选择了WebClient。打开其他选项。await 方法似乎不起作用,必须将 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      
4

2 回答 2

3

您应该使用DownloadStringTaskAsync而不是DownloadStringAsync- 此时您将能够等待结果,尽管只能在异步方法中。编辑:我认为这在 WP8 上可用,但显然不是。

如果要HttpClient在 Windows Phone 应用程序中使用,可以使用Microsoft.Net.Http NuGet 包。

(您可以使用DownloadStringAsync,这是使用 的“旧”方式WebClient,但是您需要订阅适当的事件。使用 async/await 更简洁。)

于 2013-05-04T07:48:15.107 回答
1

您可以编写类似于DownloadStringTaskAsyncJon 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;
    }
}
于 2013-05-04T09:57:12.780 回答