2009-02-16 2 views
72

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

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

Благодаря

ответ

26

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

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

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

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

+4

Привет @Ben, не могли бы вы рассказать мне, как сжать мои файлы с помощью IIS, какие все настройки мне нужно выполнить, хотя у меня нет доступа к конфигурациям IIS, Я попытаюсь это сделать. Скажите, пожалуйста, как сжимать файлы с помощью IIS? Благодаря! – Prashant

+3

http://stackoverflow.com/a/6992948/8479 подробно описывает простое изменение в web.config, необходимое для IIS7 или выше. – Rory

2

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

3

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

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

11

Причина, по которой это просто сжатие вашего файла 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

+0

Действительно awsome описания – Rakeshyadvanshi

37

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

Кредит: How to GZip on ASP.NET and GoDaddy

+0

This One работает .. –

+0

нуждается в проверке .... – 2013-06-25 21:25:21

+2

Последняя строка должна быть удалена – JeffT

11

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

Большое спасибо за этот код. Мне нужно было gzip/deflate содержание на конкретном сайте у меня нет доступа к консоли IIS, и это помогло мне. Просто вопрос: этот код, по-видимому, сбрасывает все файлы aspx и gziping CSS и ScriptResources, но это не gziping .js-файлы. Есть ли способ сделать это? Благодарю. –

+0

Это неверно, так как вы не обрабатываете качественную инструкцию следующим образом: 'gzip; q = 0, deflate'. http://www.singular.co.nz/2008/07/finding-preferred-accept-encoding-header-in-csharp/ – oligofren

0

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