32

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

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

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

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

它工作,浏览器得到一个图像。那么 MemoryStream 类中的 WriteTo 和 CopyTo 有什么区别,以及使用方法签名中Stream的类使其工作的推荐方法是什么。GetImage()

4

2 回答 2

49

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

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

memoryStream.Position = 0;
于 2012-05-18T21:18:03.667 回答
11

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

于 2012-05-18T21:43:11.900 回答