0

私はしばらく苦労してきましたが、この仕事を手に入れることができません。「一種の」非同期待機を使用して、json文字列をWindows Phone 8アプリケーションにダウンロードしようとしています。

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' の例外をスローしました」

この仕事を得る方法がわかりません。それは私が間違っていることですか?

4

1 に答える 1

1

私は今問題を見ています。エミュレーターは仮想マシンを使用しているため、ローカルホストは電話であり、PCではないため、ローカルホストを使用することはできません。このソリューションを参照してください:Windows Phone 8エミュレーター:ローカルホストにアクセス

于 2013-03-04T16:39:10.757 に答える