【问题标题】:Cant get Async (async await) download of JSON to work无法让 JSON 的异步(异步等待)下载工作
【发布时间】:2013-03-04 12:49:20
【问题描述】:

我已经苦苦挣扎了一段时间,但我就是无法完成这项工作。我正在尝试使用“某种”异步等待将 json 字符串下载到我的 Windows Phone 8 应用程序。

我正在使用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);”,我就会收到一个 WebException:

“System.Net.WebException:远程服务器返回错误:NotFound”

当我深入研究时,我注意到这个错误并不是真正的错误。当我检查 HttpExtensions 类的 GetResponseAsync 方法中的“asyncResponse”时,我注意到错误:

“AsyncWaitHandle = 'asyncResponse.AsyncWaitHandle' 引发了类型为 'System.NotSupportedException' 的异常”

我不知道如何完成这项工作。是不是我做错了什么?

【问题讨论】:

  • 很奇怪,我用的是完全相同的,它对我来说工作正常。您是否已导入此引用 nuget.org/packages/Microsoft.Bcl.Async
  • 我一直在尝试使用或不使用此软件包,但两者都返回相同的错误...当我使用在线 URL 尝试此操作时,它“有时”工作...有这与在本地尝试有关吗?我在使用 FireFox 检查 url 时,得到了我期望的结果……太奇怪了……
  • 我现在看到了问题。由于模拟器使用的是虚拟机,因此您不能使用 localhost,因为 localhost 是电话而不是您的 PC。请参阅此解决方案:stackoverflow.com/questions/13149304/…
  • 太棒了!一直以来,我都在想我在代码中做错了什么。这使它更加清晰。谢谢!
  • @robertftw 您应该将其发布为答案。

标签: c# windows-phone-8 async-await


【解决方案1】:

我现在看到了问题。由于模拟器使用的是虚拟机,因此您不能使用 localhost,因为 localhost 是电话而不是您的 PC。请参阅此解决方案:Windows Phone 8 Emulator: Access localhost

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-06
    • 2023-03-03
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多