【问题标题】:Canceling async httpwebrequests取消异步 httpwebrequest
【发布时间】:2011-04-02 00:06:10
【问题描述】:

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

任何帮助都会很棒!

【问题讨论】:

    标签: c# asynchronous httpwebrequest


    【解决方案1】:

    来自documentation for HttpWebRequest.Abort()

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多