2009-05-14 16 views
14

Tengo un simple controlador que devuelve imágenes:Diferencia entre FileStreamResult y FilePathResult?

public class ImageController : Controller 
{ 
    [AcceptVerbs(HttpVerbs.Get)] 
    [OutputCache(CacheProfile = "StationeryImageCache")] 
    public FileResult Show(int customerId, string imageName) 
    { 
     try 
     { 
      var path = string.Concat(Config.ImageDir, customerId, @"\", imageName); 
      return new FileStreamResult(new FileStream(path, FileMode.Open), "image/jpeg"); 
     } 
     catch(System.IO.FileNotFoundException ex) 
     { 
      throw new MissingImageException(imageName); 
     } 
    } 
} 

Mi manager notaron la FileStreamResult durante una revisión de código y mencionaron que debería intercambiar con:

return new FilePathResult(path, "image/jpeg"); 

Esto tenía sentido para mí, así que lo hice eso. Pero después de unos días uno de nuestros otros desarrolladores informó que algunas de las imágenes que regresaba volvían corruptas. Específicamente, hubo una gran cantidad de imágenes que fueron cortadas en algún momento. El tamaño de la imagen era correcto, pero el 25% inferior - 40% de la imagen simplemente desapareció.

Al mirar la imagen original en el sistema de archivos no había nada de malo en ello. Pellizqué la imagen en un navegador y se veía bien. Pero mi controlador solo devolvía parte de la imagen. Peor aún, solo algunas imágenes eran problemas ... aproximadamente un 30% de ellas ... aunque no puedo encontrar ninguna diferencia particular entre las que funcionan y las que no.

Al intentar depurar esto revertí el resultado de la acción a FileStreamResult, y de repente todo estaba funcionando nuevamente.

¿Alguien sabe una explicación para esto?

Respuesta

13

Parece que HttpResponse.TransmitFile que se utiliza en FilePathResult tiene o ha tenido algunos problemas. Depende de la versión de Windows que está ejecutando su servidor de acuerdo con este hotfix. Si buscas en Google algo así como 'error de respuesta.TransmitFile' obtienes muchos errores.

Supongo que deberías usar tu código original.

+0

¡Bonito hallazgo! Estaba a punto de comenzar a investigar la fuente, pero no lo habría notado, incluso si lo hubiera hecho. –