Как реализовать сжатие GZip в ASP.NET?


Я пытаюсь реализовать сжатие 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). А также В приведенном выше коде я не получаю две последние строчки, почему они используются и какова цель этих строк. Пожалуйста, объясните!

спасибо

8 74

8 ответов:

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

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

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

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

вот решение для css и javascript файлов

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

фото: как GZip on ASP.NET и GoDaddy

причина, по которой он только сжимает ваш файл 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> раздел вашего интернета.конфиг файл:

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

..

Ричард

это может быть полезно для вас попробовать его, это принимает дефляцию и сжатие 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");
        }
    } 

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

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

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

добавить .расширение aspx на .css или .js файл. Используйте или javascript в файле, чтобы обслуживать его с правильным типом MIME. & используйте перезапись URL, чтобы скрыть это от браузеров агента пользователя. Заголовок ответа кодирования содержимого добавляется gzip, чтобы передать, что gzip-это метод, используемый для выполнения сжатия. Измените набор заголовка ответа на Accept-Encoding, чтобы все кэши знали, какая страница (сжатая или несжатая) должна обслуживаться, зависит от Accept-Encoding запроса заголовок. Я подробно остановился на этом в https://stackoverflow.com/a/14509007/1624169

Вы можете просто добавить следующее в свой веб.конфигурационный файл внутри <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