2009-05-14 9 views
14

J'ai un contrôleur simple qui renvoie des images:Différence entre FileStreamResult et 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); 
     } 
    } 
} 

Mon manager remarqué la FileStreamResult lors d'un examen de code et mentionné que je dois échanger avec:

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

Cela a du sens pour moi donc je l'ai fait il. Mais après quelques jours, un de nos autres développeurs a rapporté que certaines des images que je retournais étaient de nouveau corrompues. Plus précisément, il y avait beaucoup d'images qui ont été coupées à un moment donné. La taille de l'image était correcte, mais les 25% inférieurs - 40% de l'image étaient simplement partis. Lorsque vous regardiez l'image d'origine sur le système de fichiers, il n'y avait rien de mal à cela. J'ai plopté l'image dans un navigateur et ça a l'air bien. Mais mon contrôleur ne restait qu'une partie de l'image. Pire, ce n'était que quelques images qui posaient problème ... environ 30% d'entre elles ... mais je n'arrive pas à trouver de différences particulières entre ceux qui travaillent et ceux qui ne le font pas. Pendant que j'essayais de déboguer cela, j'ai renvoyé le résultat de l'action à FileStreamResult, et tout à coup tout fonctionnait à nouveau.

Est-ce que quelqu'un connaît une explication pour cela?

Répondre

13

Il semble que le fichier HttpResponse.TransmitFile utilisé dans FilePathResult a rencontré ou rencontré quelques problèmes. Cela peut dépendre de la version de Windows sur laquelle vous exécutez votre serveur selon ce hotfix. Si vous effectuez une recherche sur Google pour quelque chose comme 'response.TransmitFile error', vous obtenez beaucoup d'erreurs. Je suppose que vous devriez utiliser votre code original!

+0

Belle trouvaille! J'étais sur le point de commencer à creuser dans la source, mais je ne l'aurais pas remarqué même si j'avais. –

Questions connexes