我正在创建一个应用程序,它将生成几个HttpWebRequest对象并通过httpRequest.BeginGetResponse
方法下载我的html。我回到IAsyncResult
并将其存储在本地,以便我可以随时取消请求,但我不确定我是否正确地执行了此操作。
以下是我要取消异步网络请求的内容:
var res = (RequestState)asyncResult.AsyncState;
res.Request.Abort();
请求的类型为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。内部异常表示“服务器主动拒绝连接”或类似的东西。
任何帮助都会很棒!
答案 0 :(得分:4)
来自documentation for HttpWebRequest.Abort():
Abort方法取消对资源的请求。取消请求后,调用GetResponse,BeginGetResponse,EndGetResponse,GetRequestStream,BeginGetRequestStream或EndGetRequestStream方法会导致WebException并将Status属性设置为RequestCanceled。
所以你描述的行为是设计的。我认为您必须捕获异常,或者在调用GetResponse,BeginGetResponse,EndGetResponse,GetRequestStream,BeginGetRequestStream或EndGetRequestStream之前找到确定是否调用Abort的方法。