ASP.NET MVC - сжатие + кеширование - PullRequest
11 голосов
/ 30 сентября 2010

Я видел несколько вариантов добавления сжатия GZIP / DEFLATE к выводу ASP.Net MVC, но все они, похоже, применяют сжатие на лету ... поэтому не используют преимущества кэширования сжатого содержимого.

Какие-нибудь решения для включения кэширования вывода сжатых страниц? Предпочтительно в коде, чтобы код MVC мог проверить, изменилась ли страница, и отгрузить предварительно сжатый кэшированный контент, если нет.

Этот вопрос действительно может относиться и к обычному asp.net.

Ответы [ 6 ]

4 голосов
/ 16 октября 2010
[Compress]
[OutputCache(Duration = 600, VaryByParam = "*", VaryByContentEncoding="gzip;deflate")]
public ActionResult Index()
{
    return View();
}
3 голосов
/ 07 мая 2013

Используйте параметры кэширования с использованием атрибутов (для MVC) и не думайте о сжатии, поскольку IIS / IISExpress автоматически сжимает ваш вывод, если вы его включаете.

как это работает, mvc не позволяет кэшировать отдельные фрагменты или части вывода (частичное кэширование содержимого). если вы хотите этого, рассмотрите возможность использования службы, такой как CloudFlare (есть ли какая-либо другая, например, CF?). он автоматически кэширует ваши выходные данные и кэширует фрагменты ваших выходных данных и обеспечивает множество других улучшений производительности и безопасности, и все это без изменений в вашем коде.

Если это не вариант для вас, то вы все равно можете использовать IISpeed ​​(это порт IIS от mod_pagespeed от Google). Он предоставляет некоторые интересные настройки, такие как удаление пробелов, встроенное сжатие CSS и js, слияние файлов js и многие другие.

Как CF, так и IISpeed ​​не заботятся о том, как построен ваш сайт, они работают на уровне http / html, поэтому они оба работают с MVC, Classic ASP.NET, php или даже с необработанными html-файлами.

1 голос
/ 09 мая 2013

Эта ссылка кажется достаточно близкой к тому, что вам нужно.Он кэширует сжатые динамически генерируемые страницы.Хотя в примере используются веб-формы, его можно адаптировать к MVC с помощью атрибута OutputCache

[OutputCache(Duration = 600, VaryByParam = "*", VaryByContentEncoding="gzip;deflate")]
1 голос
/ 08 мая 2013

Вы можете создать атрибут как

public class EnableCompressionAttribute : ActionFilterAttribute  
{  
    const CompressionMode Compress = CompressionMode.Compress;  

    public override void OnActionExecuting(ActionExecutingContext filterContext)  
    {  
        HttpRequestBase request = filterContext.HttpContext.Request;  
        HttpResponseBase response = filterContext.HttpContext.Response;  
        string acceptEncoding = request.Headers["Accept-Encoding"];  
        if (acceptEncoding == null)  
            return;  
        else if (acceptEncoding.ToLower().Contains("gzip"))  
        {  
            response.Filter = new GZipStream(response.Filter, Compress);  
            response.AppendHeader("Content-Encoding", "gzip");  
        }  
        else if (acceptEncoding.ToLower().Contains("deflate"))  
        {  
            response.Filter = new DeflateStream(response.Filter, Compress);  
            response.AppendHeader("Content-Encoding", "deflate");  
        }  
    }  
} 

Добавить запись в Global.asax.cs

        public static void RegisterGlobalFilters(GlobalFilterCollection filters)  
        {  
            filters.Add(new EnableCompressionAttribute());  
        }  

Тогда вы можете использовать этот атрибут как:

    [EnableCompression]
    public ActionResult WithCompression()
    {
        ViewBag.Content = "Compressed";
        return View("Index");
    }

Вы можете скачать рабочий пример с Github: https://github.com/ctesene/TestCompressionActionFilter

0 голосов
/ 17 октября 2010

См. Улучшение производительности с кэшированием вывода для полного введения в предмет.Основная рекомендация - использовать атрибут [ OutputCache ] в действии , к которому следует применить кэширование.

0 голосов
/ 16 октября 2010

Вы можете создать атрибут кэша:

public class CacheAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache;

        if (Enabled)
        {
            cache.SetExpires(System.DateTime.Now.AddDays(30));
        }
        else
        {
            cache.SetCacheability(HttpCacheability.NoCache);
            cache.SetNoStore();
        }
    }

    public bool Enabled { get; set; }

    public CacheAttribute()
    {
        Enabled = true;
    }
}
...