2009-05-14 8 views
14

Ich habe eine einfache Steuerung, die Bilder zurückgibt:Unterschied zwischen FileStreamResult und 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); 
     } 
    } 
} 

Mein Manager den Filestreamresult während eines Code-Review bemerkt und erwähnte ich es mit tauschen sollte:

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

Das machte Sinn, so habe ich es. Aber nach ein paar Tagen berichtete einer unserer anderen Entwickler, dass einige der Bilder, die ich zurückgab, beschädigt zurückkamen. Insbesondere gab es viele Bilder, die irgendwann abgeschnitten wurden. Die Größe des Bildes war korrekt, aber die unteren 25% - 40% des Bildes waren einfach weg.

Beim Betrachten des Originalbildes auf dem Dateisystem war nichts falsch daran. Ich legte das Bild in einen Browser und es sah gut aus. Aber mein Controller gab nur einen Teil des Bildes zurück. Schlimmer noch, es waren nur einige Bilder, die Probleme waren ... ungefähr 30% ... obwohl ich keine besonderen Unterschiede zwischen denen, die funktionieren, und denen, die nicht funktionieren, feststellen kann.

Beim Versuch, dies zu debuggen, habe ich das Ergebnis der Aktion zurück auf FileStreamResult zurückgesetzt, und plötzlich funktionierte alles wieder.

Kennt jemand eine Erklärung dafür?

Antwort

13

Es scheint, dass die HttpResponse.TransmitFile, die in FilePathResult verwendet wird, einige Probleme hatte oder hatte. Es kann von der Version von Windows abhängen, auf der Sie Ihren Server gemäß dieser hotfix ausführen. Wenn Sie in Google nach etwas wie "response.TransmitFile error" suchen, erhalten Sie viele Fehler.

Ich denke, Sie sollten Ihren ursprünglichen Code verwenden!

+0

Schöne finden! Ich wollte gerade anfangen, in die Quelle zu graben, aber das hätte ich nicht bemerkt, selbst wenn ich es getan hätte. –