C# Stream.CopyTo和MemoryStream.WriteTo之间的差异
我有一个HttpHandler通过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
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方法从当前流读取到缓冲区-读取从流的当前位置开始(索引和偏移参数是缓冲区中的索引和偏移量)-这是“保留机制”