取消异步httpwebrequest

时间:2011-04-02 00:06:11

标签: c# asynchronous httpwebrequest

我正在创建一个应用程序,它将生成几个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。内部异常表示“服务器主动拒绝连接”或类似的东西。

任何帮助都会很棒!

1 个答案:

答案 0 :(得分:4)

来自documentation for HttpWebRequest.Abort()

  

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

所以你描述的行为是设计的。我认为您必须捕获异常,或者在调用GetResponse,BeginGetResponse,EndGetResponse,GetRequestStream,BeginGetRequestStream或EndGetRequestStream之前找到确定是否调用Abort的方法。