Как реализовать сжатие GZip в ASP.NET? - PullRequest
77 голосов
/ 16 февраля 2009

Я пытаюсь реализовать сжатие GZip для моей страницы asp.net (включая мои файлы CSS и JS). Я попробовал следующий код, но он только сжимает мою страницу .aspx (нашел его из YSlow )

HttpContext context = HttpContext.Current;
context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
HttpContext.Current.Response.AppendHeader("Content-encoding", "gzip");
HttpContext.Current.Response.Cache.VaryByHeaders["Accept-encoding"] = true;

Приведенный выше код сжимает только код моей страницы .aspx (разметка), а не файлы CSS и JS, которые включены в качестве внешних файлов. Скажите, пожалуйста, как я могу реализовать сжатие GZip в ASP.NET с помощью кода (потому что я на сервере общего хостинга, где у меня нет доступа к настройкам IIS Server) А также в приведенном выше коде я не получаю последние две строки, почему они используются и какова цель этих строк. Пожалуйста, объясните!

Спасибо

Ответы [ 9 ]

41 голосов
/ 11 декабря 2010

Вот решение для файлов CSS и JavaScript. Добавьте следующий код внутрь вашего файла web.config:

  <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"/>

Кредит: Как GZip на ASP.NET и GoDaddy

28 голосов
/ 16 февраля 2009

Для сжатия файлов JS и CSS вам действительно нужно обрабатывать это на уровне IIS, поскольку эти файлы отображаются напрямую без среды выполнения ASP.NET.

Вы можете создать расширение ISX и CSSX в IIS для aspnet_isapi.dll, а затем воспользоваться вашим почтовым индексом, но IIS, вероятно, сделает эту работу лучше для вас.

Заголовок кодировки содержимого сообщает браузеру, что ему необходимо распаковать содержимое перед рендерингом. Некоторые браузеры достаточно умны, чтобы понять это, в зависимости от формы контента, но лучше просто сказать это.

Параметр кэша Accept-encoding доступен для того, чтобы кэшированная версия сжатого содержимого не отправлялась в браузер, который запрашивал только text / html.

14 голосов
/ 11 декабря 2011

это может быть полезно для вас, это допускает сжатие deflate и gzip.

    void Application_PreRequestHandlerExecute(object sender, EventArgs e)
    {
        HttpApplication app = sender as HttpApplication;
        string acceptEncoding = app.Request.Headers["Accept-Encoding"];
        Stream prevUncompressedStream = app.Response.Filter;

        if (app.Context.CurrentHandler == null)
            return;

        if (!(app.Context.CurrentHandler is System.Web.UI.Page ||
            app.Context.CurrentHandler.GetType().Name == "SyncSessionlessHandler") ||
            app.Request["HTTP_X_MICROSOFTAJAX"] != null)
            return;

        if (acceptEncoding == null || acceptEncoding.Length == 0)
            return;

        acceptEncoding = acceptEncoding.ToLower();

        if (acceptEncoding.Contains("deflate") || acceptEncoding == "*")
        {
            // deflate
            app.Response.Filter = new DeflateStream(prevUncompressedStream,
                CompressionMode.Compress);
            app.Response.AppendHeader("Content-Encoding", "deflate");
        }
        else if (acceptEncoding.Contains("gzip"))
        {
            // gzip
            app.Response.Filter = new GZipStream(prevUncompressedStream,
                CompressionMode.Compress);
            app.Response.AppendHeader("Content-Encoding", "gzip");
        }
    } 
11 голосов
/ 17 января 2010

Причина, по которой он сжимает только ваш файл ASPX, заключается в том, что написанный вами код встроен только в файл ASPX. Файл ASPX - это отдельный запрос от любого связанного содержимого, которое он содержит. Так что если у вас есть страница ASPX, которая содержит:

<img src="www.example.com\exampleimg.jpg" alt="example" />

Это составит 2 запроса (без поиска DNS) от вашего браузера к ресурсам:

  1. для страницы aspx и
  2. для изображения, содержащегося на странице aspx.

Каждый запрос имеет свой ответный поток. Размещенный вами код присоединяется только к потоку ответов ASPX, поэтому сжимается только ваша страница ASPX. Строки 1 и 2 вашего размещенного кода по существу берут нормальный поток ответов на странице и внедряют некоторый код «среднего человека», который в этом случае ест и сжимает нормальный выходной поток потоком GZip и передает его по проводам вместо этого.

Строки 3 и 4 настраивают заголовки ответа. Все http-запросы и ответы имеют заголовки, которые отправляются до содержимого. Они настраивают запрос / ответ так, чтобы сервер и клиент знали, что отправляется и как.

В этом случае строка 3 информирует браузер клиента о том, что поток ответов сжимается через gzip и, следовательно, перед его отображением браузер клиента должен распаковать его.

И в строке 4 просто включается заголовок Accept-Encoding ответа. В противном случае это было бы отсутствовать в ответе.

Существуют подключаемые модули, которые вы можете писать / получать, которые позволяют вам сжимать многоканальный тип MIME, такой как * .js и * .css, но вам лучше использовать встроенные функции сжатия IIS.

Вы не сказали, какую версию IIS вы используете, но если бы это был IIS 7.0, потребовалось бы добавить что-то вроде следующего в раздел <system.webserver> вашего файла web.config:

<httpCompression> 
  <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" /> 
 <staticTypes>
         <add mimeType="text/*" enabled="true" />
      </staticTypes>
</httpCompression> 
<urlCompression doStaticCompression="true" /> 

..

Richard

3 голосов
/ 31 марта 2009

В IIS7 все запросы отправляются в .net, поэтому вам нужно будет создать HttpModule, добавляющий эти заголовки ко всем ответам.

Без IIS7 и на виртуальном хостинге вам пришлось бы создать обработчик, который отобразил расширение файла .net, которое вы не используете (например, .asmx), и в файле web.config укажите, что файлы .asmx отправляются в ваш HttpHandler. который настроен так, чтобы переписать путь к .jpg или как-то еще и установить там заголовок.

2 голосов
/ 16 февраля 2009

Чтобы ответить на ваш последний вопрос. Эти две строки устанавливают заголовки HTTP для ответа, отправляемого обратно в браузер. Content-Encoding сообщает браузеру, что ответ закодирован как gzip и его необходимо декодировать. Последняя строка добавляет Accept-Encoding к заголовку Vary . При этом браузер или прокси-серверы могут определить, был ли ответ уникальным или под влиянием некоторых других заголовков, и настроить их кэширование.

0 голосов
/ 13 июня 2019
        Either do in the web.config file 
<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>

    or you can do it on IIS level

        For compressing JS & CSS files you actually have to handle that at the IIS level, since these files are rendered directly without the ASP.NET runtime.
        You could make a JSX & CSSX extension mapping in IIS to the aspnet_isapi.dll and then take advantage of your zip code, but IIS is likely to do a better job of this for you.
        The content-encoding header tells the browser that it needs to unzip the content before rendering. Some browsers are smart enough to figure this out anyway, based on the shape of the content, but it's better to just tell it.
        The Accept-encoding cache setting is there so that a cached version of the gzipped content won't be sent to a browser that requested only text/html. 
0 голосов
/ 21 апреля 2018

Вы можете просто добавить следующее в ваш файл web.config в элементе <system.webServer>:

<urlCompression doStaticCompression="true" doDynamicCompression="true" />

ПРИМЕЧАНИЕ. Если вы используете более старую версию IIS (менее v7.5), вы можете установить для doDynamicCompression значение false, так как процесс интенсивно загружал процессор. Эти проблемы были устранены в IIS 7.5.

Ссылка: https://docs.microsoft.com/en-us/iis/configuration/system.webserver/urlcompression

0 голосов
/ 24 января 2013

Добавьте расширение .aspx в файл .css или .js. Используйте <% @ Page ContentType = "text / css"%> или javascript в файле, чтобы предоставить его с правильным типом MIME. & используйте URL Rewrite, чтобы скрыть это от браузеров пользовательских агентов. Заголовок ответа для кодирования содержимого добавляется в gzip, чтобы передать, что gzip - это метод, используемый для сжатия. Различный заголовок ответа установлен в Accept-Encoding, поэтому все кэши знают, какую страницу (сжатую или несжатую) следует обслуживать, зависит от заголовка Accept-Encoding запроса. Я уточнил это на https://stackoverflow.com/a/14509007/1624169

...