Отмена асинхронного httpwebrequests - PullRequest
2 голосов
/ 02 апреля 2011

Я создаю приложение, которое создаст несколько объектов HttpWebRequest, и загружаю мой html методом httpRequest.BeginGetResponse. Я возвращаю IAsyncResult и храню его локально, чтобы я мог отменить запрос в любое время, но я не уверен, правильно ли я это делаю.

Вот что я делаю для отмены асинхронного веб-запроса:

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

Где запрос имеет тип HttpWebRequest.

Что я замечаю, так это то, что даже после того, как я вызываю эти строки кода, в моем приложении все еще открыты все потоки Async. И если я устанавливаю точку останова в делегате, вызываемом в 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());
}

и я получаю исключение WebException в строке using (Stream dataStream = httpWebResponse.GetResponseStream()). Внутреннее исключение говорит что-то вроде «сервер активно отказал в соединении» или что-то в этом роде.

Любая помощь будет отличной!

1 Ответ

4 голосов
/ 02 апреля 2011

Из документации для HttpWebRequest.Abort () :

Метод Abort отменяет запрос к ресурсу.После отмены запроса вызов метода GetResponse, BeginGetResponse, EndGetResponse, GetRequestStream, BeginGetRequestStream или EndGetRequestStream вызывает WebException со свойством Status, установленным в RequestCanceled.

Таким образом, описываемое вами поведение является заданнымЯ думаю, вам придется перехватить исключение или найти способ определения, был ли Abort вызван перед вызовом GetResponse, BeginGetResponse, EndGetResponse, GetRequestStream, BeginGetRequestStream или EndGetRequestStream.

...