2010-08-12 36 views
5

En algunas páginas de álbumes de fotos, quiero mostrar aproximadamente 20 miniaturas. Estas miniaturas se cargan programáticamente desde una base de datos. esas miniaturas ya están redimensionadas. Cuando les muestro las imágenes cargan un poco lento. algunos tardan 0.5 segundos en cargar algo de espera durante 2 segundos. La base de datos no importa porque cuando elimino la capa de la base de datos, el problema de rendimiento aún existe. Cuando cargo las mismas imágenes directamente con html, el problema se carga inmediatamente.ASP.NET MVC imagen lenta de carga a través de MVC framework?

Está cargando imágenes/archivos a través del marco de mvc lenta o me falta algo?

esto va demasiado lento

//in html 
<img src='/File/Image.jpg' border='0'>      

//in controller 
public FileResult File(string ID) 
{   
    //database connection removed, just show a pic 
    byte[] imageFile = System.IO.File.ReadAllBytes(ID); 
    return new FileContentResult(imageFile,"image/pjpeg"); 
} 

Esto va inmediatamente

<img src='/Content/Images/Image.jpg' border='0'>      

Respuesta

1

Está añadiendo sobrecarga de procesamiento mediante la exposición de la imagen a través de la MVC. Cuando se vincula directamente a una imagen, IIS maneja automáticamente, en lugar de la interconexión de MVC, por lo que omite una gran cantidad de sobrecarga.

Además, al cargar en una matriz de bytes, está cargando la imagen completa del disco en la memoria y luego transfiriéndola, en lugar de simplemente transmitir directamente desde el disco.

Usted puede obtener un rendimiento ligeramente mejor con esto:

[OutputCache(Duration=60, VaryByParam="*")] 
public FileResult File(string ID) 
{ 
    string pathToFile; 
    // Figure out file path based on ID 
    return File(pathToFile, "image/jpeg"); 
} 

Pero no va a ser tan rápido como saltarse MVC en total para los archivos estáticos.

Si lo anterior lo soluciona para usted, probablemente querrá perder el tiempo con los parámetros de almacenamiento en caché.

+0

aún, el problema de rendimiento se mantiene. muy raro. simplemente va demasiado lento como para ponerlo todo en el mvc por encima. – MichaelD

+1

La otra cosa a considerar es si el navegador está guardando en caché o no. Definitivamente se almacenará en caché para acceder directamente al archivo, pero puede ser que se vea forzado a cargar el archivo cada vez que use un método de acción. Actualizaré mi sugerencia para agregar almacenamiento en caché. –

9

Tuve el mismo problema. Estoy usando MVC 3. Después de sacarme el pelo, lo que descubrí es que una vez que utilizas el estado de sesión en tu aplicación web, la carga dinámica de la imagen parece obstruirse, debido a las solicitudes de sesión intensas. Para solucionar esto, he decorado mi controlador con:

[SessionState (System.Web.SessionState.SessionStateBehavior.Disabled)]

Este desactivado el estado de la sesión para mi controlador de fotos, y la velocidad de regresar. Si está utilizando una versión anterior de MVC, tendrá que saltar algunos aros y crear una fábrica de Controlador/Controlador para hacer esto. Ver How can I disable session state in ASP.NET MVC?

Espero que esto ayude!

+0

Deshabilitar el estado de la sesión en el controlador me solucionó este problema también. Espero que el equipo de MVC pueda abordar este problema, porque estoy seguro de que el estado de la sesión es importante en algunos casos. – joelsand

+0

¡Acabas de salvar mi día! Tenía exactamente el mismo problema y el estado de sesión de desactivación lo solucionó, pero lo que significa que el problema sigue ahí en MVC 4. FYI: Necesitaba la "sobrecarga de MVC" ya que las imágenes no son públicamente accesibles y mi acción verifica los derechos de los usuarios y luego devuelve el imagen si se le permite. P.S .: Tuve la experiencia de que esto solo me sucedió al cargar varias imágenes al mismo tiempo, pero no al cargar una sola imagen ... – ChrFin

Cuestiones relacionadas