Интересно, сообщает ли поток о досрочном завершении; Вы также должны посмотреть, вернул ли Read
неположительное число, т.е.
while (bytesRead < contentLength)
{
int got = stream.Stream.Read(
buffer.Buffer, bytesRead, contentLength - bytesRead);
if(got <= 0) throw new EndOfStreamException(string.Format(
"Expected {0} bytes; {1} bytes received", contentLength, bytesRead));
bytesRead += got;
}
По сути, если поток закрылся, каждый вызов Read
будет возвращать неположительное значение (вероятно, 0) - так что ваш цикл while
станет узким циклом "прочитайте 0, добавьте 0, чтение 0, добавление 0, чтение 0, добавление 0, чтение 0, добавление 0 ".
В качестве последнего замечания ваш подход предполагает, что вы выделяете byte[]
на основе входящего заголовка длины содержимого; только предупреждение: убедитесь, что вы проверяете это и ограничиваете его нормальными значениями, иначе атака DOS тривиальна. Кроме того, если возможно Я бы предложил по возможности использовать потоковый API, чтобы избегать необходимости загружать все это в память сразу (если вы не ограничили входящий размер таким образом, чтобы это не беспокойство).