ASP.NET MVC: Http Handler умер, да здравствует FileResult

вторник, 9 марта 2010, Евгений Жарков

Если вы разрабатывали приложения в 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


Ищите нас в интернетах!

Комментарии

Свежие вакансии