Разница между Stream.CopyTo и MemoryStream.WriteTo

У меня есть HttpHandler, возвращающий изображение через Response.OutputStream. У меня такой код:

_imageProvider.GetImage().CopyTo(context.Response.OutputStream);

Метод GetImage() возвращает Stream, который на самом деле является экземпляром MemoryStream, и возвращает браузеру 0 байтов. Если я изменю сигнатуру метода GetImage(), чтобы вернуть MemoryStream и использовать следующую строку кода:

_imageProvider.GetImage().WriteTo(context.Response.OutputStream);

Это работает, и браузер получает изображение. Итак, в чем разница между WriteTo и CopyTo в классе MemoryStream и каков рекомендуемый способ заставить это работать, используя класс Stream в сигнатуре метода GetImage().


person jorgehmv    schedule 18.05.2012    source источник


Ответы (2)


WriteTo() сбрасывает позицию чтения до нуля перед копированием данных - CopyTo(), с другой стороны, копирует все данные, оставшиеся после текущей позиции в потоке. Это означает, что если вы не сбросили позицию самостоятельно, данные вообще не будут считаны.

Скорее всего, вы просто пропустили следующее в своей первой версии:

memoryStream.Position = 0;
person BrokenGlass    schedule 18.05.2012
comment
я думаю, что copyTo сохраняет источник, а writeto - нет. - person Royi Namir; 19.05.2012
comment
откуда у тебя такая информация? не могли бы вы предоставить ссылку? - person Royi Namir; 19.05.2012

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

person Royi Namir    schedule 18.05.2012
comment
Просто для сохранения согласованности страницы: метод IternalCopyTo описывает Чтение из текущего потока в буфер — чтение начинается с текущей позиции потока (параметрами index и offset являются index и offset в буфере) - это остатки механизма - person Max Yakimets; 17.01.2014