ASP.NET MVC: Http Handler умер, да здравствует FileResult
Если вы разрабатывали приложения в ASP.NET MVC, то достаточно хорошо знакомы с классом ActionResult. ActionResult самый распространенный тип объектов возвращаемый действием. Когда разрабатывается MVC приложения, большую часть времени вы используете именно ActionResult класс.
На предыдущей неделе, я работал над своим open source проектом WeBlog, я создавал HTTP Handler для обработки изображений. Я начал использовать HTTP Handler для изображений, потому что нуждался в механизме предотвращения дополнительной нагрузке(hotlinking). Единственным минусом в использовании HTTP Handler - уродливые URL адреса. Вот пример, что у меня получалось:
/Image.axd?image=sample.png
К счастью, мой друг Рон рассказал мне, что я могу отказаться от HTTP Handler и использовать для этого метод действия контроллера, которое возвращает FileResult. После небольшого расследования, я понял, что Рон был абсолютно прав. Я удалил свой HTTP Handler и заменил его следующим кодом, который добавил в контроллер Home:
private string GetContentType(string filename) { FileInfo file = new FileInfo(filename); switch (file.Extension.ToUpper()) { case ".PNG": return "image/png"; case ".JPG": return "image/jpeg"; case ".JPEG": return "image/jpeg"; case ".GIF": return "image/gif"; case ".BMP": return "image/bmp"; case ".TIFF": return "image/tiff"; default: throw new NotSupportedException("The Specified File Type Is Not Supported"); } } public FileResult GetImage(string id) { string path = Path.Combine(Engine.GetImageDirectory().FullName, id); return base.File(path, GetContentType(path)); }
Так как мой код проживает в контроллере Home, я должен использовать URL адреса следующего вида - “/Home/GetImage/sample.png” для отображения картинки. Предположительно, что данный URL может способствовать ошибкам, поэтому я решил использовать собственный маршрут. Новый маршрут назван “Images” и привязан к метода GetImaget контроллера Home. А вот вам и код для global.asax:
routes.MapRoute("Images", "Images/{id}", new { controller = "Home", action = "GetImage", id = "" });
Теперь я могу обращаться к изображениям следующим образом:
/Images/sample.png
Для пользователя это выглядит как традиционный путь к файлу. Тем не менее, не существует директории “Images” в корне проекта. “Images” является именем маршрута. Все изображения хранятся в папке App_Data/Images.
Используя объект FileResult в MVC вы получите не только красивые URL адреса, но и гибкость в расположении изображений. Вы можете хранить изображения в любом месте, где пожелаете, а URL никогда не изменится!
Источник - Michael Ceranski