Stream.CopyTo和MemoryStream.WriteTo之间的区别

时间:2012-05-18 21:15:03

标签: c# stream httphandler memorystream

我有一个HttpHandler通过Response.OutputStream返回一个图像。我有以下代码:

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

GetImage()方法返回一个Stream,它实际上是一个MemoryStream实例,它向浏览器返回0个字节。如果我更改GetImage()方法签名以返回MemoryStream并使用以下代码行:

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

它有效并且浏览器获取图像。那么在MemoryStream类中WriteTo和CopyTo之间的区别是什么,以及在Stream方法签名中使用GetImage()类使其工作的建议方法是什么。

2 个答案:

答案 0 :(得分:42)

WriteTo()在复制数据之前将读取位置重置为零 - 另一方面CopyTo()将复制流中当前位置之后剩余的任何数据。这意味着如果您没有自己重置位置,则根本不会读取任何数据。

您很可能在第一个版本中错过了以下内容:

memoryStream.Position = 0;

答案 1 :(得分:10)

根据反射器,这是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到目的地的所有内容(以缓冲区大小为块)。