Задать вопрос

Сжатие(Compress) в ASP.NET MVC?

Есть несколько способов сжатия в ASP.NET MVC:
  1. добавления метода Application_BeginRequest в Global.ASCX
    protected void Application_BeginRequest(object sender, EventArgs e)
        {
    
            // Implement HTTP compression
            HttpApplication app = (HttpApplication)sender;
    
    
            // Retrieve accepted encodings
            string encodings = app.Request.Headers.Get("Accept-Encoding");
            if (encodings != null)
            {
                // Check the browser accepts deflate or gzip (deflate takes preference)
                encodings = encodings.ToLower();
                if (encodings.Contains("deflate"))
                {
                    app.Response.Filter = new DeflateStream(app.Response.Filter, CompressionMode.Compress);
                    app.Response.AppendHeader("Content-Encoding", "deflate");
                }
                else if (encodings.Contains("gzip"))
                {
                    app.Response.Filter = new GZipStream(app.Response.Filter, CompressionMode.Compress);
                    app.Response.AppendHeader("Content-Encoding", "gzip");
                }
            }
        }


  2. Через фильтры:
    public class CompressFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext 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);
            }
        }
    }

    Ну и потом обвешивать нужные методы и т.п.:
    [CompressFilter]
    public ActionResult Index()
    {}


  3. Добавления в Web.Config соответствующих инструкций:
    <system.webServer>
        <httpCompression>
          <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/>
          <dynamicTypes>
            <add mimeType="text/*" enabled="true"/>
            <add mimeType="message/*" enabled="true"/>
            <add mimeType="application/javascript" enabled="true"/>
            <add mimeType="*/*" enabled="false"/>
          </dynamicTypes>
          <staticTypes>
            <add mimeType="text/*" enabled="true"/>
            <add mimeType="message/*" enabled="true"/>
            <add mimeType="application/javascript" enabled="true"/>
            <add mimeType="*/*" enabled="false"/>
          </staticTypes>
        </httpCompression>
        <urlCompression doStaticCompression="true" doDynamicCompression="true"/>
      </system.webServer>



1. Какая разница в между первым и вторым способом? Помимо того, что первый сжимает всё, а второй только то что пометили соответствующим атрибутом.
2. Качество сжатия между всеми тремя способами?
3. Если в Web.Confige просто включить сжатие
<urlCompression doStaticCompression="true" doDynamicCompression="true"/>
то сжатие будет такое же как и в 3 способе?
4.Главный вопрос, какой метод и когда используют?
  • Вопрос задан
  • 1702 просмотра
Подписаться 10 Оценить 2 комментария
Решения вопроса 1
dabrahabra
@dabrahabra
.NET Developer
  1. Разница в том, на каком этапе будет добавляться фильтр сжатия + как Вы отметили во втором варианте вы сами контролируете какие Actions будут поподать под сжатие
  2. Нет разницы
  3. Почти, целевые mime-types будут браться из конфига IIS - он может отличаться от указанного в пункте #3
  4. Не забывайте что сжатие потребляет ресурс - CPU, но уменьшает объем трафика. Конкретное решение зависит от ваших требований и проблемы, которую Вы пытаетесь решить. Вариант №1 всегда проигрывает №2 в гибкости. Только вариант №3 позволяет сжимать статику. Если цель сжимать всё - используйте №2 (регестрировать глобально) и/или №3. Если отдельные Actions которые возвращают большие страницы - №2.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы