Разница между 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, и внезапно все снова работало.

Кто-нибудь знает объяснение этого?

Ответы

Ответ 1

Похоже, что HttpResponse.TransmitFile, который используется в FilePathResult, имел или имел несколько проблем. Это может зависеть от версии Windows, на которой запущен ваш сервер в соответствии с этим исправлением. Если вы ищете в Google что-то вроде "response.TransmitFile error", вы получаете много ошибок.

Я думаю, вы должны использовать свой оригинальный код!