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