Разница между 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", вы получаете много ошибок.
Я думаю, вы должны использовать свой оригинальный код!