[英]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();
}
}
}
}
}
}
幾件事情:
我認為您不能重復使用相同的請求對象。 也就是說,您可以為每個HttpWebRequest實例調用一次BeginGetRequestStream。 如果要執行兩個請求(對服務器的調用),則每個請求需要兩個HttpWebRequest實例。
如果您想要同步行為,則有兩個選擇:使用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.