Ответ 1
Является ли WebAPI за брандмауэром, веб-прокси, пакетом защиты от вирусов? Как упоминалось в Даже более быстрых веб-сайтах: лучшие рекомендации для веб-разработчиков от Steve Souders Это может привести к удалению заголовков.
Я добавил запись web.config, чтобы включить сжатие gzip на основе этого ответа S/O Включить IIS7 gzip.
Затем я проверил окно Chrome Developer при загрузке страницы ASPX и увидел заголовок в ответе:
Cache-Control:private
Content-Encoding:gzip
Content-Length:3669
Content-Type:text/html; charset=utf-8
Date:Wed, 04 Mar 2015 00:46:05 GMT
Server:Microsoft-IIS/7.5
Vary:Accept-Encoding
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET
Значит, это "работает", правильно? Но при поиске этого заголовка при вызове Web API его нет:
Cache-Control:no-cache
Content-Length:551
Content-Type:application/json; charset=utf-8
Date:Wed, 04 Mar 2015 00:53:05 GMT
Expires:-1
Pragma:no-cache
Server:Microsoft-IIS/7.5
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET
Я пробовал все виды различных конфигураций (начиная с того, который был рекомендован в связанном ответе S/O выше). Наконец, в отчаянии я поставил его на это, и я думал, что он попытается сжать все запросы (все, кроме */* закомментировано):
<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
<scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/>
<dynamicTypes>
<add mimeType="*/*" enabled="true"/>
<!--<add mimeType="text/*" enabled="true"/>
<add mimeType="message/*" enabled="true"/>
<add mimeType="application/javascript" enabled="true"/>
<add mimeType="application/json" enabled="true"/>-->
<!--<add mimeType="*/*" enabled="false"/> -->
</dynamicTypes>
<staticTypes>
<add mimeType="*/*" enabled="true"/>
<!--<add mimeType="text/*" enabled="true"/>
<add mimeType="message/*" enabled="true"/>
<add mimeType="application/javascript" enabled="true"/>
<add mimeType="application/json" enabled="true"/>-->
<!-- add mimeType="*/*" enabled="false"/>-->
</staticTypes>
</httpCompression>
<urlCompression doStaticCompression="true" doDynamicCompression="true"/>
Что может помешать GZIP применяться к моим методам веб-API?
Обновление
С тех пор я попробовал как пакет сжатия NuGet Web API, так и редактирование applicationHost.config как в IIS Express 8.0 (Visual Studio) и локально установленный IIS 7.5. Все дали одинаковые результаты: запросы на другие типы mime, такие как text/* work, но application/json отказывается быть gzipped.
Является ли WebAPI за брандмауэром, веб-прокси, пакетом защиты от вирусов? Как упоминалось в Даже более быстрых веб-сайтах: лучшие рекомендации для веб-разработчиков от Steve Souders Это может привести к удалению заголовков.
Согласно сжатие ASP.NET Web API (блог Ben Foster) у вас есть два варианта:
Измените applicationHost.config
и добавьте
в httpCompression → раздел dynamicTypes.
Используйте обработчик делегирования в конвейере веб-api для обработки сжатия.
например Fabrik.Common или Поддержка сжатия веб-API Microsoft ASP.NET
Я думаю, что вы сделали всю домашнюю работу на стороне сервера, но проблема в запросе.
Чтобы сервер сжимал ответ, он должен был включать этот заголовок в запрос:
Accept-Encoding: gzip, deflate
Если вы этого не сделаете, независимо от того, что вы делаете на стороне сервера, ответ никогда не будет сжат.
Вы не указываете, какой из них является вашим клиентом веб-API, но всегда есть способ добавить заголовки в запрос с помощью клиентского API.
Я думаю, что @Peeticus был на правильном пути.
Вот что я сделал, чтобы заставить его работать:
После запуска "Install-Package Microsoft.AspNet.WebApi.MessageHandlers.Compression" или добавления его через GUI вам необходимо обновить /App _Start/WebApiConfig.cs
Требуются следующие дополнительные операторы:
using Microsoft.AspNet.WebApi.MessageHandlers.Compression.Compressors;
using Microsoft.AspNet.WebApi.MessageHandlers.Compression;
Добавьте в метод WebApiConfig.Register следующее:
GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new ServerCompressionHandler(new GZipCompressor(), new DeflateCompressor()));
Далее в IISExpress applicationHost.config найдите <httpCompression> <dynamicTypes> элемент и следующее до значения по умолчанию < add mimeType = "/" enabled = "false" / >
<add mimeType="application/json" enabled="true" />
Также в updateHost.config update < urlCompression/ > до
<urlCompression doDynamicCompression="true" />
Благодаря двум вышеперечисленным решениям и другим решениям в другом месте я посчитал шаг за шагом объяснение того, как получить сжатие HTTP, работающее с Web API 2.2, может оказаться полезным, поскольку несколько пакетов/пространств имен были изменены с тех пор, как указанные выше сообщения.
1) Используя консоль менеджера пакетов nuget, установите следующее:
Install-Package Microsoft.AspNet.WebApi.MessageHandlers.Compression
2) Внутри WebApiConfig.cs добавьте эти сообщения;
using System.Net.Http.Extensions.Compression.Core.Compressors;
using Microsoft.AspNet.WebApi.Extensions.Compression.Server;
3) Внутри WebApiConfig.cs добавить нижнюю часть реестра (конфигурацию HttpConfiguration);
GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new ServerCompressionHandler(new GZipCompressor(), new DeflateCompressor()));
4) Отредактируйте свой web.config и внутри system.webServer add;
<urlCompression doStaticCompression="true" doDynamicCompression="true" dynamicCompressionBeforeCache="true" />
<httpCompression>
<dynamicTypes>
<clear />
<add enabled="true" mimeType="text/*" />
<add enabled="true" mimeType="message/*" />
<add enabled="true" mimeType="application/x-javascript" />
<add enabled="true" mimeType="application/javascript" />
<add enabled="true" mimeType="application/json" />
<add enabled="false" mimeType="*/*" />
<add enabled="true" mimeType="application/atom+xml" />
</dynamicTypes>
<staticTypes>
<clear />
<add enabled="true" mimeType="text/*" />
<add enabled="true" mimeType="message/*" />
<add enabled="true" mimeType="application/javascript" />
<add enabled="true" mimeType="application/atom+xml" />
<add enabled="true" mimeType="application/xaml+xml" />
<add enabled="true" mimeType="application/json" />
<add enabled="false" mimeType="*/*" />
</staticTypes>
</httpCompression>
Работал в первый раз на местном и лазурном веб-сайте, поэтому, надеюсь, он работает для вас! Плюс, конечно, не нужно возиться с applicationHost.config...
В вашей реализации пакета NuGet Microsoft.AspNet.WebApi.MessageHandlers.Compression вы добавили требуемую строку (ниже) в файл App_Start\WebApiConfig.cs? Обратите внимание: это должно быть после всех других обработчиков сообщений в том же самом методе, что и в инструкциях на домашнем сайте пакета.
GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new ServerCompressionHandler(new GZipCompressor(), new DeflateCompressor()));
Здесь образец метода Register из файла WebApiConfig, который я использовал в блоге:
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { echo = RouteParameter.Optional }
);
GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new ServerCompressionHandler(new GZipCompressor(), new DeflateCompressor()));
}
Это сообщение в блоге, которое я упомянул: . Сжатие Net Web API
Сначала.
IIS игнорирует сжатие отклика WEB API, поскольку ответы веб-api имеют тип mime
application/json; charset=utf-8
Настройки сжатия IIS по умолчанию не включают этот тип Mime, поэтому они не сжимают ответ.
Итак, вам нужно добавить этот тип mime в раздел <dynamicTypes>
<add mimeType="application/json; charset=utf-8" enabled="true" />
(Или просто проверить его, как вы делали <add mimeType="*/*" enabled="true" />
)
НО
По умолчанию <httpCompression>
Раздел заблокирован IIS для настроек извне!
Таким образом, любые настройки, указанные вами на web.config, получат игнорируются!
Если вы не укажете эти параметры в разделе applicationHost.config <httpCompression>
ИЛИ
отредактируйте раздел <httpCompression>
, чтобы разрешить настройки извне.
<section name="httpCompression" allowDefinition="MachineToApplication" overrideModeDefault="Allow" />