c# stream httphandler memorystream

c# - Diferencia entre Stream.CopyTo y MemoryStream.WriteTo



httphandler (2)

Según el reflector, esta es la definición del método 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); } }

No veo ningún "mecanismo de restos" aquí ... Copia todo desde this al destino (en bloques de tamaño de búfer).

Tengo un HttpHandler que devuelve una imagen a través de Response.OutputStream . Tengo el siguiente código:

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

GetImage() método GetImage() devuelve un Stream que en realidad es una instancia de MemoryStream y está devolviendo 0 bytes al navegador. Si cambio la firma del método GetImage() para devolver un MemoryStream y usar la siguiente línea de código:

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

Funciona y el navegador obtiene una imagen. Entonces, ¿cuál es la diferencia entre WriteTo y CopyTo en la clase MemoryStream, y cuál es la manera recomendada de hacer que esto funcione con la clase Stream en la firma del método GetImage() ?


WriteTo() restablece la posición de lectura a cero antes de copiar los datos. CopyTo() por otro lado, copiará los datos que queden después de la posición actual en la secuencia. Eso significa que si no restableció la posición usted mismo, no se leerá ningún dato.

Lo más probable es que te pierdas lo siguiente en tu primera versión:

memoryStream.Position = 0;