В вашем коде нет ничего плохого. Тот факт, что вы говорите «Я проверил поток. Длина перед копированием и он не пустой» заставляет меня задуматься о позиции потока перед копированием.
Если вы уже использовали исходный поток один раз, хотя поток не имеет нулевой длины, его позиция может быть в конце потока - поэтому больше нечего копировать.
Если поток доступен для поиска (который будет для MemoryStream
или FileStream
и многих других), попробуйте поставить
stream.Position = 0
как раз перед копией. Это сбрасывает позицию потока в начало, что означает, что весь код будет скопирован вашим кодом.