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?
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. –