2010-08-12 11 views
5

In alcune pagine di un libro fotografico voglio mostrare 20 miniature. Queste miniature sono caricate in modo programmatico da un database. quelle miniature sono già ridimensionate. Quando li mostro le immagini si caricano lentamente. alcuni impiegano 0,5 secondi per caricare un po 'di attesa per 2 secondi. Il database non ha importanza perché quando rimuovo il livello del database, il problema di prestazioni esiste ancora. Quando carico le stesse immagini direttamente con il codice html, il problema si verifica immediatamente.ASP.NET MVC caricamento lento dell'immagine tramite il framework MVC?

Il caricamento di immagini/file tramite il framework mvc è lento o mi manca qualcosa?

Questo va troppo 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"); 
} 

questo va immediatamente

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

risposta

1

Si sta aggiungendo elaborazione overhead esponendo l'immagine tramite MVC. Quando si collega direttamente a un'immagine, questa viene gestita automaticamente da IIS, anziché dalla pipeline MVC, quindi si salta un sacco di spese generali.

Inoltre, caricando in un array di byte, si sta caricando l'intera immagine dal disco in memoria e quindi in streaming, anziché semplicemente lo streaming direttamente dal disco.

Si potrebbe ottenere prestazioni leggermente migliori con questo:

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

Ma non sarà abbastanza veloce come saltare MVC del tutto per file statici.

Se quanto sopra lo risolve per voi, probabilmente vorrete fare un giro con i parametri di memorizzazione nella cache.

+0

ancora, il problema di prestazioni rimane. molto strano. è troppo lento per metterlo tutto sull'overhead del mvc. – MichaelD

+1

L'altra cosa da considerare è se o meno viene memorizzato nella cache dal browser. Sarà sicuramente memorizzato nella cache per gli accessi diretti al file, ma potrebbe essere che è costretto a caricare il file ogni volta che si utilizza un metodo di azione. Aggiornerò il mio suggerimento per aggiungere il caching. –

9

Ho avuto lo stesso problema. Sto usando MVC 3. Dopo aver tirato fuori i miei capelli, quello che ho scoperto è che una volta che usi lo stato sessione nella tua app web, il caricamento dinamico delle immagini sembra essere intasato, a causa delle richieste della sessione martellante. Per risolvere questo problema, ho decorato il mio controller con:

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

Questa disattivato lo stato di sessione per il mio controller foto, e la velocità restituito. Se utilizzi una versione precedente di MVC, dovrai eseguire alcuni passaggi e creare una fabbrica di controller/controller per eseguire questa operazione. Vedi How can I disable session state in ASP.NET MVC?

Spero che questo aiuti!

+0

Anche lo stato della sessione disabilitato sul controller ha risolto questo problema. Speriamo che questo problema possa essere risolto dal team MVC, perché sono sicuro che lo stato della sessione sia importante in alcuni casi. – joelsand

+0

Hai appena salvato la mia giornata! Aveva esattamente lo stesso problema e disabilitato stato di sessione risolto, ma il problema è ancora lì in MVC 4. Per vostra informazione: avevo bisogno del "sovraccarico MVC" in quanto le immagini non sono pubblicamente accessibili e la mia azione controlla i diritti degli utenti e quindi restituisce il immagine se gli è permesso. P.S .: Ho avuto l'esperienza che mi è capitato solo quando caricavo più immagini contemporaneamente, ma non quando caricavo una singola immagine ... – ChrFin