Подтвердить что ты не робот

Разница между 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().

4b9b3361

Ответ 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 в пункт назначения (в блоках размера буфера).