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

这对我来说很有意义,所以我做到了。但几天后,我们的一位其他开发人员报告说,我返回的一些图像被损坏了。具体来说,有很多图像在某个时候被截断。图像的大小是正确的,但图像底部的 25% - 40% 完全消失了。

在文件系统上查看原始图像时,它没有任何问题。我将图像放入浏览器中,看起来不错。但我的控制器只返回了部分图像。更糟糕的是,只有一些图像存在问题......其中大约 %30 ......虽然我无法找到有效和无效之间的任何特殊差异。

在尝试调试时,我将操作的结果恢复为 FileStreamResult,突然一切都恢复了。

有谁知道对此的解释?

4

1 回答 1

13

FilePathResult 中使用的 HttpResponse.TransmitFile 似乎存在或曾经存在一些问题。根据此修补程序,它可能取决于您运行服务器的 Windows 版本。如果您在 Google 上搜索“response.TransmitFile 错误”之类的内容,您会收到很多错误。

我想你应该使用你的原始代码!

于 2009-05-14T13:42:10.123 回答