Microsoft User Group Винница feedback ASP.NET MVC: Http Handler умер, да здравствует FileResult - Разработка приложений - Microsoft User Group Винница

 

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()) {
    //images
    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


Поділитись


Related Posts with Thumbnails Posted мар 09 2010, 03:02 by Евгений Жарков View 1 700 2
Filed under: , ,

Comments

ch_mvc_asp.net on 03-10-2010 8:25

В заголовке весьма спорное утверждение. Вот еще в тему

codehelper.ru/.../250  . Кроме того, хендлеры могут легко повторно использоваться и находиться в любой сборке.

лупняшок on 03-18-2010 18:01

а вы запускали свой пример? роутинг не пашет, пишет что ресурс не найден

Add a Comment

(required)  
(optional)
(required)  
Remember Me?
Please add 7 and 5 and type the answer here:

Enter captcha:

Информация

О нас
Timeline
Спонсоры
Поддержать

Разделы

Блоги
Медиа
Форумы
Вики
Презентации

Работа

Вакансии
Компании

Проекты

TechPosters
Data Mining SDK
Численные методы на C#
iPhoner
Data Extracting SDK

Контакты

msugvn@gmail.com
krakovetsky.alex
@msugvnua
ВКонтакте
LinkedIn
Facebook
INETA

Разработка логотипа: Helen

Статистика

Powered by Community Server (Non-Commercial Edition), by Telligent Systems