+7 (495) 229-0436   shopadmin@itshop.ru 119334, г. Москва, ул. Бардина, д. 4, корп. 3
 
 
Вход
 
 
Каталог
 
 
Подписка на новости
Новости ITShop
Windows 7 и Office: Новости и советы
Обучение и сертификация Microsoft
Вопросы и ответы по MSSQLServer
Delphi - проблемы и решения
Adobe Photoshop: алхимия дизайна
 
Ваш отзыв
Оцените качество магазина ITShop.ru на Яндекс.Маркете. Если вам нравится наш магазин - скажите об этом Google!
 
 
Способы оплаты
 
Курс расчета
 
 1 у.е. = 92.51 руб.
 
 Цены показывать:
 
 
 
 
  
Новости, статьи, акции
 

Кэширование и сжатие данных (gzip) в ASP.NET MVC

24.11.2009 15:42

Кэширования является неотъемлимой частью любого крупного сайта. Посмотрим как на практике реализуется кэширование в ASP.NET MVC.

Создадим следующий ActionFilter:

  1. using System;   
  2. using System.Web;   
  3. using System.Web.Mvc;   
  4.   
  5. public class CacheFilterAttribute : ActionFilterAttribute   
  6. {   
  7.     /// <summary>   
  8.     /// Gets or sets the cache duration in seconds. The default is 10 seconds.   
  9.     /// </summary>   
  10.     /// <value>The cache duration in seconds.</value>   
  11.     public int Duration   
  12.     {   
  13.         get;   
  14.         set;   
  15.     }   
  16.   
  17.     public CacheFilterAttribute()   
  18.     {   
  19.         Duration = 10;   
  20.     }   
  21.   
  22.     public override void OnActionExecuted(FilterExecutedContext filterContext)   
  23.     {   
  24.         if (Duration <= 0) return;   
  25.   
  26.         HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache;   
  27.         TimeSpan cacheDuration = TimeSpan.FromSeconds(Duration);   
  28.   
  29.         cache.SetCacheability(HttpCacheability.Public);   
  30.         cache.SetExpires(DateTime.Now.Add(cacheDuration));   
  31.         cache.SetMaxAge(cacheDuration);   
  32.         cache.AppendCacheExtension("must-revalidate, proxy-revalidate");   
  33.     }   
  34. }  
using System;
using System.Web;
using System.Web.Mvc;

public class CacheFilterAttribute : ActionFilterAttribute
{
    /// <summary>
    /// Gets or sets the cache duration in seconds. The default is 10 seconds.
    /// </summary>
    /// <value>The cache duration in seconds.</value>
    public int Duration
    {
        get;
        set;
    }

    public CacheFilterAttribute()
    {
        Duration = 10;
    }

    public override void OnActionExecuted(FilterExecutedContext filterContext)
    {
        if (Duration <= 0) return;

        HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache;
        TimeSpan cacheDuration = TimeSpan.FromSeconds(Duration);

        cache.SetCacheability(HttpCacheability.Public);
        cache.SetExpires(DateTime.Now.Add(cacheDuration));
        cache.SetMaxAge(cacheDuration);
        cache.AppendCacheExtension("must-revalidate, proxy-revalidate");
    }
}

Применяется такой ActionFilter очень просто:

  1. [CacheFilter(Duration = 60, Order = 2)]   
  2. [OutputCache(Duration = 60, VaryByParam = "None", Order = 1)]   
  3. public ActionResult Index(string alias)  
[CacheFilter(Duration = 60, Order = 2)]
[OutputCache(Duration = 60, VaryByParam = "None", Order = 1)]
public ActionResult Index(string alias)

Теперь результат Index будет закэширован на 60 секунд. OutputCache отвечает за кэширование результата, а CacheFilter за заголовки возвращаемые сервером. Для сжатия данных методом gzip, подойдет следующий ActionFilter:

  1. using System.Web;   
  2. using System.Web.Mvc;   
  3.   
  4. public class CompressFilter : ActionFilterAttribute   
  5. {   
  6.     public override void OnActionExecuting(FilterExecutingContext filterContext)   
  7.     {   
  8.         HttpRequestBase request = filterContext.HttpContext.Request;   
  9.   
  10.         string acceptEncoding = request.Headers["Accept-Encoding"];   
  11.   
  12.         if (string.IsNullOrEmpty(acceptEncoding)) return;   
  13.   
  14.         acceptEncoding = acceptEncoding.ToUpperInvariant();   
  15.   
  16.         HttpResponseBase response = filterContext.HttpContext.Response;   
  17.   
  18.         if (acceptEncoding.Contains("GZIP"))   
  19.         {   
  20.             response.AppendHeader("Content-encoding", "gzip");   
  21.             response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);   
  22.         }   
  23.         else if (acceptEncoding.Contains("DEFLATE"))   
  24.         {   
  25.             response.AppendHeader("Content-encoding", "deflate");   
  26.             response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);   
  27.         }   
  28.     }   
  29. }  
using System.Web;
using System.Web.Mvc;

public class CompressFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(FilterExecutingContext filterContext)
    {
        HttpRequestBase request = filterContext.HttpContext.Request;

        string acceptEncoding = request.Headers["Accept-Encoding"];

        if (string.IsNullOrEmpty(acceptEncoding)) return;

        acceptEncoding = acceptEncoding.ToUpperInvariant();

        HttpResponseBase response = filterContext.HttpContext.Response;

        if (acceptEncoding.Contains("GZIP"))
        {
            response.AppendHeader("Content-encoding", "gzip");
            response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
        }
        else if (acceptEncoding.Contains("DEFLATE"))
        {
            response.AppendHeader("Content-encoding", "deflate");
            response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
        }
    }
}

Применяется следующим образом:

  1. [CompressFilter(Order = 3)]   
  2. [CacheFilter(Duration = 60, Order = 2)]   
  3. [OutputCache(Duration = 60, VaryByParam = "None", Order = 1)]   
  4. public ActionResult Index(string alias)  
[CompressFilter(Order = 3)]
[CacheFilter(Duration = 60, Order = 2)]
[OutputCache(Duration = 60, VaryByParam = "None", Order = 1)]
public ActionResult Index(string alias)

Order - порядок следования аттрибутов. В результате - ответ сервера, с кэшированием ("Cache-control: public, must-relative, proxy-revalidate, max-age=30") и сжатием ("Content-Encoding: gzip"):

 

Ссылки по теме

Файлы

  
Помощь
Задать вопрос
 программы
 обучение
 экзамены
 компьютеры
Бесплатный звонок
ICQ-консультанты
Skype-консультанты

Общая справка
Как оформить заказ
Тарифы доставки
Способы оплаты
Прайс-лист
Карта сайта
 
Бестселлеры
Курсы обучения "Atlassian JIRA - система управления проектами и задачами на предприятии"
Microsoft Windows 10 Профессиональная 32-bit/64-bit. Все языки. Электронный ключ
Microsoft Office для Дома и Учебы 2019. Все языки. Электронный ключ
Курс "Oracle. Программирование на SQL и PL/SQL"
Курс "Основы TOGAF® 9"
Microsoft Office 365 Персональный 32-bit/x64. 1 ПК/MAC + 1 Планшет + 1 Телефон. Все языки. Подписка на 1 год. Электронный ключ
Курс "Нотация BPMN 2.0. Ее использование для моделирования бизнес-процессов и их регламентации"
 

О нас
Интернет-магазин ITShop.ru предлагает широкий спектр услуг информационных технологий и ПО.

На протяжении многих лет интернет-магазин предлагает товары и услуги, ориентированные на бизнес-пользователей и специалистов по информационным технологиям.

Хорошие отзывы постоянных клиентов и высокий уровень специалистов позволяет получить наивысший результат при совместной работе.

В нашем магазине вы можете приобрести лицензионное ПО выбрав необходимое из широкого спектра и ассортимента по самым доступным ценам. Наши менеджеры любезно помогут определиться с выбором ПО, которое необходимо именно вам. Также мы проводим учебные курсы. Мы приглашаем к сотрудничеству учебные центры, организаторов семинаров и бизнес-тренингов, преподавателей. Сфера сотрудничества - продвижение бизнес-тренингов и курсов обучения по информационным технологиям.



 

О нас

 
Главная
Каталог
Новинки
Акции
Вакансии
 

Помощь

 
Общая справка
Как оформить заказ
Тарифы доставки
Способы оплаты
Прайс-лист
Карта сайта
 

Способы оплаты

 

Проекты Interface Ltd.

 
Interface.ru   ITShop.ru   Interface.ru/training   Olap.ru   ITnews.ru  
 

119334, г. Москва, ул. Бардина, д. 4, корп. 3
+7 (495) 229-0436   shopadmin@itshop.ru
Проверить аттестат
© ООО "Interface Ltd."
Продаем программное обеспечение с 1990 года