2012-05-18 39 views
24

Tengo un HttpHandler devolviendo una imagen a través de Response.OutputStream. Tengo el siguiente código:Diferencia entre Stream.CopyTo y MemoryStream.WriteTo

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

GetImage() método devuelve una Stream que es en realidad una instancia MemoryStream y se vuelve 0 bytes en el navegador. Si cambio GetImage() método de firma para devolver un MemoryStream y utilizar 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 forma recomendada de hacer que esto funcione usando la clase Stream en la firma del método GetImage()?

Respuesta

38

WriteTo() está restableciendo la posición de lectura a cero antes de copiar los datos - CopyTo() por el contrario copiará los datos que queden después de la posición actual en la secuencia. Eso significa que si no reinició la posición usted mismo, no se leerán los datos.

Lo más probable es que sólo se pierda lo siguiente en su primera versión:

memoryStream.Position = 0; 
+1

Creo que copyTo guarda la fuente mientras writeto isnt. –

+5

¿De dónde sacaste esa información? ¿Puedes por favor proporcionar el enlace? –

+0

Ojalá la neurona del cerebro tuviera un enlace público accesible. – viento

9

De acuerdo con reflector, esta es la definición CopyTo() Método:

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 ninguna "sigue siendo el mecanismo "aquí ... Copia todo desde this hasta el destino (en bloques de tamaño de búfer).

+0

@nonnb print screen? documentación? –

+0

disculpas, por favor ignore mi comentario - mi error - estaba copiando entre 2 filestreams y olvidé rebobinar una de las secuencias antes de llamar a CopyTo. CopyTo funciona como usted + BrokenGlass ha descrito – StuartLC

+4

Solo para mantener la página coherente: el método _IternalCopyTo_ descrito _Reads_ del flujo actual en el búfer - la lectura comienza desde la posición actual de la secuencia (los parámetros de índice y desplazamiento son indexados y compensados ​​en el búfer) - ese es el "mecanismo de los restos" –