14

画像を返す単純なコントローラーがあります。

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");

これは私にとって理にかなっていたので、私はそれをしました。しかし、数日後、他の開発者の 1 人が、私が返品した画像の一部が破損して戻ってくると報告しました。具体的には途中で途切れてしまった画像が多かったです。画像のサイズは正しかったのですが、画像の下部 25% ~ 40% がなくなっていました。

ファイル システム上の元のイメージを見ると、何も問題はありませんでした。ブラウザに画像を表示したところ、問題なく表示されました。しかし、私のコントローラーは画像の一部しか返していませんでした。さらに悪いことに、問題があったのは一部の画像だけでした...それらの約 30% でした...ただし、機能するものと機能しないものの間に特定の違いは見つかりませんでした。

これをデバッグしようとしているときに、アクションの結果を FileStreamResult に戻したところ、突然すべてが再び機能するようになりました。

誰かがこれについての説明を知っていますか?

4

1 に答える 1

13

FilePathResult で使用される HttpResponse.TransmitFile に問題があるか、いくつかの問題があったようです。この修正プログラムに従って、サーバーを実行している Windows のバージョンによって異なる場合があります。Google で「response.TransmitFile エラー」などを検索すると、多くのエラーが表示されます。

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

于 2009-05-14T13:42:10.123 に答える