Как отменить чтение из потока, полученного с помощью 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().