我有一个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()
类使其工作的建议方法是什么。
答案 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
到目的地的所有内容(以缓冲区大小为块)。