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

Спасибо

Ответ 1

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

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

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

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

Ответ 2

Вот решение для 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

Ответ 3

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

Ответ 4

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

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

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

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

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

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

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

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

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

Вы не сказали, какой verson 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" /> 

..

Ричард

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

Ответ 9

Либо сделайте это с файлом 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>

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

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

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

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