C# Stream.CopyTo和MemoryStream.WriteTo之间的差异

C# Stream.CopyTo和MemoryStream.WriteTo之间的差异,c#,stream,httphandler,memorystream,C#,Stream,Httphandler,Memorystream,我有一个HttpHandler通过Response.OutputStream返回图像。我有以下代码: _imageProvider.GetImage().CopyTo(context.Response.OutputStream); GetImage()方法返回一个流,它实际上是一个MemoryStream实例,并向浏览器返回0字节。如果我更改GetImage()方法签名以返回MemoryStream并使用以下代码行: _imageProvider.GetImage().WriteTo(cont

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

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

_imageProvider.GetImage().WriteTo(context.Response.OutputStream);
它可以工作,浏览器会得到一个图像。那么,MemoryStream类中WriteTo和CopyTo的区别是什么?建议使用
GetImage()
方法签名中的
Stream
类来实现这一点的方法是什么?

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

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

memoryStream.Position = 0;

根据reflector,这是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);
    }
}

我没有看到任何“残留机制”在这里。。。它将所有内容从
这个
复制到目的地(以缓冲区大小为单位)。

我认为copyTo保留了源代码,而writeto没有。你从哪里得到的信息?您可以提供链接吗?只是为了保持页面一致:所描述的IternalCopyTo方法从当前流读取到缓冲区-读取从流的当前位置开始(索引和偏移参数是缓冲区中的索引和偏移量)-这是“保留机制”