繁体   English   中英

取消异步httpwebrequests

[英]Canceling async httpwebrequests

我正在制作一个将制作多个HttpWebRequest对象的应用程序,并通过httpRequest.BeginGetResponse方法下载我的html。 我取回IAsyncResult并将其存储在本地,以便可以随时取消请求,但是我不确定是否正确执行了该请求。

这是我要取消异步Web请求的操作:

var res = (RequestState)asyncResult.AsyncState;
res.Request.Abort();

其中Request是HttpWebRequest类型。

我注意到的是,即使在调用这些代码行之后,我的应用程序中仍然打开了所有异步线程。 而且,如果我在httpRequest.BeginGetResponse(GetResponseCallback, state)调用的委托中设置了一个断点(例如,方法GetResponseCallback ),则调试器将在几秒钟后在方法内部中断,从而导致在运行该方法时引发WebException。

为了完整起见,我的GetResponseCallback如下所示:

using (var httpWebResponse = (HttpWebResponse)request.EndGetResponse(result))
using (Stream dataStream = httpWebResponse.GetResponseStream())
using (var reader = new StreamReader(dataStream))
{
    string ret = reader.ReadToEnd();
    state.OnComplete(ret, new EventArgs());
}

并且在using (Stream dataStream = httpWebResponse.GetResponseStream())行上得到了WebException。 内部异常显示诸如“服务器主动拒绝连接”之类的内容。

任何帮助将是极好的!

HttpWebRequest.Abort()文档中

Abort方法取消对资源的请求。 取消请求后,调用GetResponse,BeginGetResponse,EndGetResponse,GetRequestStream,BeginGetRequestStream或EndGetRequestStream方法会导致WebException,其Status属性设置为RequestCanceled。

因此,您描述的行为是设计使然。 我认为您必须捕获异常,否则必须找到某种方法来确定是否在调用GetResponse,BeginGetResponse,EndGetResponse,GetRequestStream,BeginGetRequestStream或EndGetRequestStream之前调用了Abort。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM