簡體   English   中英

執行異步Web請求時出現問題

[英]Problem Executing Async Web Request

誰能告訴我我用這個簡單的代碼做錯了什么? 當我運行它掛

using (Stream postStream = request.EndGetRequestStream(asynchronousResult))

如果我注釋掉requestState.Wait.WaitOne(); 行代碼可以正確執行,但顯然不等待響應。 我猜想對EndGetRequestStream的調用以某種方式使我回到了主線程的上下文中? 我很確定我的代碼與示例基本相同( MSDN文檔

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.IO;
using System.Text;

namespace SBRemoteClient
{
    public class JSONClient
    {

        public string ExecuteJSONQuery(string url, string query)
        {
            System.Uri uri = new Uri(url);
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
            request.Method = "POST";
            request.Accept = "application/json";
            byte[] requestBytes = Encoding.UTF8.GetBytes(query);
            RequestState requestState = new RequestState(request, requestBytes);
            IAsyncResult resultRequest = request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), requestState);
            requestState.Wait.WaitOne();
            IAsyncResult resultResponse = (IAsyncResult)request.BeginGetResponse(new AsyncCallback(GetResponseStreamCallback), requestState);
            requestState.Wait.WaitOne();

            return requestState.Response;
        }

        private static void GetRequestStreamCallback(IAsyncResult asynchronousResult)
        {
            try
            {
                RequestState requestState = (RequestState)asynchronousResult.AsyncState;
                HttpWebRequest request = requestState.Request;
                using (Stream postStream = request.EndGetRequestStream(asynchronousResult))
                {
                    postStream.Write(requestState.RequestBytes, 0, requestState.RequestBytes.Length);
                }
                requestState.Wait.Set();
            }
            catch (Exception e) {
                Console.Out.WriteLine(e);
            }
        }

        private static void GetResponseStreamCallback(IAsyncResult asynchronousResult)
        {
            RequestState requestState = (RequestState)asynchronousResult.AsyncState;
            HttpWebRequest request = requestState.Request;
            using (HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult))
            {
                using (Stream responseStream = response.GetResponseStream())
                {
                    using (StreamReader streamRead = new StreamReader(responseStream))
                    {
                        requestState.Response = streamRead.ReadToEnd();
                        requestState.Wait.Set();
                    }
                }
            }
        }
    }
}

幾件事情:

  1. 我認為您不能重復使用相同的請求對象。 也就是說,您可以為每個HttpWebRequest實例調用一次BeginGetRequestStream。 如果要執行兩個請求(對服務器的調用),則每個請求需要兩個HttpWebRequest實例。

  2. 如果您想要同步行為,則有兩個選擇:使用GetRespose方法或以同步方式使用begin / end。 為此,您無需將回調傳遞給BeginGetRequestStream方法(您可以傳遞null)。 從BeginGetRequestStream(IAsyncResult)獲取返回的值,並將其傳遞給EndGetRequestStream方法:

     AsyncResult resultRequest = request.BeginGetRequestStream(null, null); Stream postStream = request.EndGetRequestStream(asynchronousResult) 

EndGetRequestStream將阻塞,直到請求完成為止(如果您是從UI進行的,這很不好,但是仍然可以使用)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM