2009-05-14 2 views
14

Ho un semplice controllo che restituisce immagini:Differenza tra FileStreamResult e 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); 
     } 
    } 
} 

Il mio manager notato l'FileStreamResult nel corso di una revisione del codice e menzionati dovrei scambiare con:

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

Questo ha senso per me così ho fatto esso. Ma dopo alcuni giorni uno dei nostri altri sviluppatori ha riferito che alcune delle immagini che stavo restituendo stavano tornando corrotte. Nello specifico, ci sono state molte immagini che sono state tagliate a un certo punto. La dimensione dell'immagine era corretta, ma in basso il 25% - il 40% dell'immagine era semplicemente sparita.

Quando si guardava l'immagine originale sul file system non c'era niente di sbagliato in esso. Ho ritagliato l'immagine in un browser e sembrava soddisfacente. Ma il mio controller stava solo restituendo parte dell'immagine. Peggio ancora, erano solo alcune immagini che erano problemi ... circa% 30 di loro ... anche se non sono in grado di trovare differenze particolari tra quelli che funzionano e quelli che non lo fanno.

Durante il tentativo di eseguire il debug, ho ripristinato il risultato dell'azione su FileStreamResult e improvvisamente tutto stava funzionando di nuovo.

Qualcuno sa una spiegazione per questo?

risposta

13

Sembra che HttpResponse.TransmitFile utilizzato in FilePathResult abbia o abbia avuto alcuni problemi. Potrebbe dipendere dalla versione di Windows in cui viene eseguito il server in base a questo hotfix. Se cerchi su Google qualcosa come "response.TransmitFile error" ottieni molti errori.

Immagino che dovresti usare il tuo codice originale!

+0

Bella scoperta! Stavo per iniziare a scavare nella fonte, ma non l'avrei notato nemmeno se l'avessi fatto. –