Как отменить чтение из потока, полученного с помощью HttpWebResponse.GetResponseStream ()? - PullRequest
0 голосов
/ 13 июля 2011

Я использую метод 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 ]

1 голос
/ 15 июля 2011

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

1 голос
/ 13 июля 2011

Лучше, если вместо этого вы сохраните свой 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#content

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

...