Как отменить чтение из потока, полученного с помощью HttpWebResponse.GetResponseStream()?

Я использую метод HttpWebResponse.BeginGetResponse(), чтобы сделать запрос на мой сервер. В уведомлении "Запрос выполнен" я делаю следующее (без кода обработки ошибок):

HttpWebResponse response = (HttpWebResponse)myHttpWebRequest.EndGetResponse(result);
BinaryReader streamReader = new BinaryReader(response.GetResponseStream());

while ((readSize = streamReader.Read(buffer, 0, buffer.Length)) > 0)
{
...
}

Мой вопрос, если это нормально, чтобы сохранить поток, полученный из response.GetResponseStream() где-то в качестве переменной-члена и сделать отмену запроса следующим образом:

m_requestState.httpRequest.Abort();
m_requestState.httpRequestStream.Close(); // If this is missing then
// streamReader.Read() locks for a long time when connection is lost.

Этот код заставляет streamReader.Read() генерировать исключение System.ObjectDisposedException.

Спасибо!
Михай

2 ответа

Решение

После того, как я провел небольшое исследование, я пришел к выводу, что единственное решение для разблокировки streamReader.Read() должен включить в метод отмены также вызовm_requestState.httpRequestStream.Close() (как указано в первоначальном вопросе). Это сделает звонок streamReader.Read() выдать исключение ObjectDisposedException и уведомление "Запрос завершен" для завершения выполнения.

Лучше всего вместо этого сохранить свой webRequest и отменить его при попытке:

    public void Cancel()
    {
        IsCancelled = true; 

        try
        {
            if (WebRequest != null)
            {
                WebRequest.Abort();
            }
        }
        catch (Exception ex)
        {
            // slicence!
        }
    } 

Смотрите WebDownloader HelperClass здесь:

http://www.manorey.net/mohblog/?p=17

Флаг IsCancelled устанавливается в методе cancel(), чтобы избежать вызова OnComplete() даже после вызова Abort().

Другие вопросы по тегам