2009-05-14 5 views
14

FileStreamResultと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); 
     } 
    } 
} 

私のマネージャーは、コードレビューの間FileStreamResultに気づき、私はそれを交換する必要があり述べた:私がやったように、

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

これは私には意味をなさそれ。しかし、数日後に私の他の開発者の一人が、私が戻ってきたイメージの一部が壊れて戻ってきたと報告しました。具体的には、ある時点で多くの画像がカットされていました。画像のサイズは正しいが、画像の底部25%〜40%は単に消えてしまった。

ファイルシステム上の元のイメージを見ると、何も問題はありませんでした。私はブラウザで画像をプルーピングし、うまく見えました。しかし、私のコントローラーはイメージの一部を返すだけでした。さらに悪いことに、いくつかの画像しか問題ではありませんでした...そのうちの約30%は...私は仕事とそうでないものの間に特別な違いは見つかりませんでした。

これをデバッグしようとしますが、私は戻ってFileStreamResultにアクションの結果を元に戻すと、突然、すべてが再び働いていました。

誰でも説明がありますか?

答えて

13

FilePathResultに使用されているHttpResponse.TransmitFileが持っているか、いくつかの問題があったことが表示されます。これは、hotfixに従ってサーバーを実行しているWindowsのバージョンによって異なる場合があります。 Googleで 'response.TransmitFile error'のようなものを検索すると、多くのエラーが発生します。

元のコードを使用する必要があります。

+0

ニースが見つかりました!私はソースを掘り起こそうとしていましたが、私が持っていてもこれに気付かなかったでしょう。 –

関連する問題