FileStreamResult和FilePathResult之间的区别?

时间:2009-05-14 13:28:07

标签: asp.net-mvc actionresult

我有一个简单的控制器可以返回图像:

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,突然一切都恢复了。

有人知道对此的解释吗?

1 个答案:

答案 0 :(得分:13)

在FilePathResult中使用的HttpResponse.TransmitFile似乎有或有一些问题。它可能取决于您根据此hotfix运行服务器的Windows版本。如果您在Google上搜索“response.TransmitFile error”之类的内容,则会出现很多错误。

我猜您应该使用原始代码!