Ну, вы закрываете поток, помещая его в оператор using
- но вы должны закрывать его, так что это вряд ли проблема.
Параточек для начала:
- Я бы не стал использовать
BinaryWriter
здесь.Это ничего не покупает.Пишите прямо в поток. Если memStream
является MemoryStream
, вы можете использовать WriteTo
:
using (var reqStream = req.GetRequestStream())
{
memStream.WriteTo(reqStream);
}
Это означает, что вы не будете получать диагностику, но это делает код проще:)
Теперь, что касается того, что происходит ... моя догадка в том, что вы получаете исключение ввызов Write
, но это исключение эффективно заменяется на исключение, создаваемое при закрытии потока.
У меня есть идея, почему исключение также может быть выдано ...
Вы устанавливаете длину контента где-нибудь?Потому что вы, вероятно, пройдете через это.Посмотрите на эту строку:
reqWriter.Write(buffer);
Это записывает весь буфер на каждую итерацию цикла, игнорируя, сколько данных вы только что прочитали.Вы уже присвоили количество байтов, считанных в переменную read
, но тогда вы никогда не используете это значение.Вы можете исправить это, изменив его на
reqWriter.Write(buffer, 0, read);
... но лично я бы не стал.Я бы или просто использовал бы MemoryStream.WriteTo
или , чтобы написать прямо в поток запросов ... как я уже говорил, BinaryWriter
на самом деле ничего не покупает.
В любом случае, в вашем текущем коде для каждого запроса вы пытаетесь написать кратное 25600 байт, независимо от длины вашего контента.Я не удивлюсь, если поток запросов заметит это и выдаст исключение.Давайте представим, что у нас есть 30000 байтов данных.Я подозреваю, что последовательность выглядит примерно так:
- Длина содержимого установлена на 30000
- Получить поток и ввести с помощью оператора
- Считать 25600 байт из потока памяти
- Записать 25600 байт: поток подтверждает правильность
- Считать 4400 байт из потока памяти (т. Е. Все оставшиеся данные)
- Попробуйте немедленно записать 25600 байт: поток решает, что это неверно, и выдает
IOException
- Неявный блок
finally
оператора using
, затем удаляет поток, который закрывает его - Поток замечает, что только25600 байт были успешно записаны, но этого недостаточно, поэтому выбрасывает исключение
. Подобные вещи делают плохой идеей для библиотек генерировать исключения из Dispose
... ноЕсли предположить, что я прав, то это создает забавную проблему: вы одновременно пытались записать слишком много и слишком мало данных:)