Разница между Stream.CopyTo и MemoryStream.WriteTo
У меня есть HttpHandler, возвращающий изображение через Response.OutputStream
. У меня есть следующий код:
_imageProvider.GetImage().CopyTo(context.Response.OutputStream);
GetImage()
возвращает a Stream
, который фактически является экземпляром MemoryStream
, и он возвращает 0 байт в браузер. Если я изменяю подписи GetImage()
, чтобы вернуть a MemoryStream
и использовать следующую строку кода:
_imageProvider.GetImage().WriteTo(context.Response.OutputStream);
Это работает, и браузер получает изображение. Итак, какова разница между WriteTo и CopyTo в классе MemoryStream, и каков рекомендуемый способ сделать это, используя класс Stream
в сигнатуре метода GetImage()
.
Ответы
Ответ 1
WriteTo()
сбрасывает позицию чтения до нуля перед копированием данных - с другой стороны, скопирует все данные после текущей позиции в потоке. Это означает, что если вы не сделали reset позицию самостоятельно, никакие данные не будут прочитаны вообще.
Скорее всего, вы просто пропустите следующее в своей первой версии:
memoryStream.Position = 0;
Ответ 2
В соответствии с рефлектором это определение метода CopyTo():
private void InternalCopyTo(Stream destination, int bufferSize)
{
int num;
byte[] buffer = new byte[bufferSize];
while ((num = this.Read(buffer, 0, buffer.Length)) != 0)
{
destination.Write(buffer, 0, num);
}
}
Я не вижу здесь никакого механизма останова... Он копирует все из this
в пункт назначения (в блоках размера буфера).