BinaryReader.Read не генерирует IOException при потере соединения - PullRequest
3 голосов
/ 04 августа 2011

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

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

try
{
    while ((readSize = streamReader.Read(buffer, 0, buffer.Length)) > 0)
    {
    ...
    }
}
catch (Exception)
{   // NEVER GET HERE!!
...
}

Моя проблема в том, что я не могу обнаружить ошибки соединения во время чтения данных из потока (во время цикла while). Поведение очень странное: оно завершает чтение всех данных, которые ОС имеет в кэше, а затем возвращает «readSize = 0», как в случае «конца потока». Я ожидал, что streamReader.Read () сгенерирует исключение IOException , но это не ! Я пытался найти где-нибудь флаг fail , но кажется, что его нет (Stream / BinaryReader / HttpWebResponse). Пожалуйста, помогите!

Я проверил это, используя три сценария, и у всех было одинаковое поведение:

  1. Использование соединения USB между телефоном и ПК
    • Телефон подключен к Интернету через ПК через USB-соединение
    • После нескольких успешных вызовов streamReader.Read () я отключаю сетевую карту ПК
  2. Использование WIFI-соединения
    • Телефон подключен к интернету через WIFI
    • После нескольких успешных вызовов streamReader.Read () я выключаю WIFI-маршрутизатор
  3. Использование WIFI-соединения
    • Телефон подключен к Интернету через WIFI-соединение
    • После нескольких успешных вызовов streamReader.Read () я удаляю кабель WAN (поэтому он не имеет доступа к Интернету).

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

1 Ответ

0 голосов
/ 14 октября 2011

Если вы не получаете исключение, тогда одним из вариантов является проверка количества прочитанных байтов в ответе. ContentLength

...