异步 HttpWebRequest 不起作用
本文关键字:不起作用 HttpWebRequest 异步 | 更新日期: 2023-09-27 18:34:58
我有这段代码,它旨在进行异步调用,但事实并非如此,请看一下它,让我知道哪里出了问题。
try
{
byte[] bytes;
Stream objRequestStream = null;
bytes = System.Text.Encoding.ASCII.GetBytes(GetJSONforGetMenuDetails(Id, MenuIds));
wReq = (HttpWebRequest)WebRequest.Create(new Uri("http://" + MobileWLCUrl + urlCreateCacheAPI));
wReq.ContentLength = bytes.Length;
wReq.ContentType = "text/x-json";
wReq.ServicePoint.Expect100Continue = false;
wReq.Method = "POST";
objRequestStream = wReq.GetRequestStream();
objRequestStream.Write(bytes, 0, bytes.Length);
objRequestStream.Close();
wReq.BeginGetResponse(new AsyncCallback(FinishWebRequest), null);
//resp = WebAccess.GetWebClient().UploadString("http://" + MobileWLCUrl + urlCreateCacheAPI, GetJSONforGetMenuDetails(Id, MenuIds));
//EngineException.CreateLog("Cache Created (for Menus: " + MenuIds + ") in API for LocationId: " + Id);
}
catch (Exception ex) { EngineException.HandleException(ex); }
void FinishWebRequest(IAsyncResult result)
{
WebResponse wResp = wReq.EndGetResponse(result) as WebResponse;
StreamReader sr = new StreamReader(wResp.GetResponseStream());
String res = sr.ReadToEnd();
EngineException.CreateLog("Cache Created (for Menus: " + MenuIds + ") in API for LocationId: " + LocId);
}
哪里出了问题?当我调试它时,它会等待调用结束以继续,但这不应该发生。
BeginGetResponse
被记录为包含一个同步部分:
方法需要一些同步安装任务来 完成(DNS 解析、代理检测和 TCP 套接字连接、 例如(,在此方法变为异步之前。结果, 绝不应在用户界面 (UI( 线程上调用此方法 因为这可能需要一些时间,通常是几秒钟。在一些 网络代理脚本配置不正确的环境, 这可能需要 60 秒或更长时间。
除此之外,如果您在请求有时间完成之前调用FinishWebRequest
(技术上,如果您调用EndGetResponse
(,EndGetResponse
将阻止。
这是意料之中的,因为EndGetResponse
需要向您返回一个可以从中获取响应数据的对象 - 但是如果请求尚未完成,它如何返回这样的对象?