Итак, я немного похож на IIS7 n00b, но я использовал большинство старых систем IIS, начиная с 3. Я пытаюсь включить динамическое сжатие, и оно в основном работает. Это не работает для моих запросов ADO.Net Data Service (Astoria), пакетных или нет.
я нашел трассировка неудавшегося запроса (FREB) что было действительно полезно. И то, что я вижу по необработанным запросам, это Reason Code 12, NO_MATCHING_CONTENT_TYPE
. Хорошо, поэтому у меня не указан соответствующий тип MIME, это просто.
За исключением того, что это то, что у меня есть в моем web.config (что я считаю правильным, но, возможно, нет).
<httpCompression dynamicCompressionDisableCpuUsage="100"
dynamicCompressionEnableCpuUsage="100"
noCompressionForHttp10="false"
noCompressionForProxies="false"
noCompressionForRange="false"
sendCacheHeaders="true"
staticCompressionDisableCpuUsage="100"
staticCompressionEnableCpuUsage="100">
<dynamicTypes>
<clear/>
<add mimeType="*/*"
enabled="true" />
</dynamicTypes>
<staticTypes>
<clear/>
<add mimeType="*/*"
enabled="true" />
</staticTypes>
</httpCompression>
<urlCompression doDynamicCompression="true"
doStaticCompression="true"
dynamicCompressionBeforeCache="false" />
Теперь я думаю, что это означает, что он должен сжимать любой запрос, который включает заголовок Accept: Gzip. Я хотел бы знать, что здесь могут подумать другие.
Мой скрипач след:
GET /SecurityDataService.svc/GetCurrentAccount HTTP/1.1
Accept-Charset: UTF-8
Accept-Language: en-us
dataserviceversion: 1.0;Silverlight
Accept: application/atom+xml,application/xml
maxdataserviceversion: 1.0;Silverlight
Referer: http://sdev03/apptestpage.aspx
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64; Trident/4.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.21022; .NET CLR 3.5.30729; InfoPath.2; .NET CLR 3.0.30729; OfficeLiveConnector.1.4; OfficeLivePatch.1.3)
Host: sdev03
Connection: Keep-Alive
Cookie: .ASPXAUTH=<snip>
HTTP/1.1 200 OK
Cache-Control: no-cache
Content-Type: application/atom+xml;charset=utf-8
Server: Microsoft-IIS/7.0
DataServiceVersion: 1.0;
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
Date: Mon, 22 Mar 2010 22:29:06 GMT
Content-Length: 2726
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
*** <snip> removed ***
Хорошо, оказывается, вы не можете настроить это в web.config, только в appHost.config. Я предполагал, что в документации действительно написано appHost.config, но я предполагал, что это спецификация общей концепции, а не единственное допустимое расположение конфигурации.
Из новой установки мой applicationHost.config
(в %windir%\system32\inetsrv\config
) имел следующую настройку:
<section name="httpCompression" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
... а также набор типов MIME по умолчанию для сжатия, который, к сожалению, не включает JSON и другие типы данных, которые были бы хорошими кандидатами на сжатие.
Переключение на:
<section name="httpCompression" overrideModeDefault="Allow" />
позволяет конфигурировать httpCompression
тег под system.webServer
отметка в моем web.config
.
Я подтвердил это, установив httpCompression
раздел applicationHost.config
кому:
<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
<scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" />
<dynamicTypes>
<add mimeType="*/*" enabled="false" />
</dynamicTypes>
<staticTypes>
<add mimeType="*/*" enabled="false" />
</staticTypes>
</httpCompression>
... и теперь я могу установить все типы MIME, которые действительно хочу сжать в web.config
.
Питер, спасибо за подсказку - мы тоже нашли эту настройку
<add mimeType="application/atom+xml; charset=utf-8" enabled="true" />
в <httpCompression>
раздел applicationHost.config
исправил это.
Нам также пришлось указать кодировку из-за ошибки в коде сжатия:
В коде сжатия есть ошибка, заключающаяся в том, что он неправильно анализирует кодировку в заголовке ответа, поэтому вам придется настроить «application / xml; charset = utf-8» в настройках динамического сжатия, чтобы оно работало.
Вот соответствующий раздел полностью
<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
<scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" staticCompressionLevel="9" dynamicCompressionLevel="4" />
<scheme name="deflate" dll="%Windir%\system32\inetsrv\gzip.dll" staticCompressionLevel="9" dynamicCompressionLevel="4" />
<dynamicTypes>
<add mimeType="text/*" enabled="true" />
<add mimeType="message/*" enabled="true" />
<add mimeType="application/x-javascript" enabled="true" />
<add mimeType="application/atom+xml; charset=utf-8" 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>
Чтобы добавить недостающие миметипы из PowerShell, используйте следующие команды:
Add-WebConfiguration -Filter '/system.webServer/httpCompression/staticTypes' -PSPath 'IIS:\' -AtIndex 0 -Value @{mimeType='application/javascript'; enabled='True'}
Add-WebConfiguration -Filter '/system.webServer/httpCompression/staticTypes' -PSPath 'IIS:\' -AtIndex 0 -Value @{mimeType='image/svg+xml'; enabled='True'}
Add-WebConfiguration -Filter '/system.webServer/httpCompression/staticTypes' -PSPath 'IIS:\' -AtIndex 0 -Value @{mimeType='text/css'; enabled='True'}
Обратите внимание, что порядок mimeTypes важен, поскольку IIS, похоже, берет первое совпадение. Это означает, что mimeTypes с подстановочными знаками (*) должны быть ниже mimeTypes без подстановочных знаков. Поэтому убедитесь, что mimeType */*
находится внизу, так как любая запись ниже не будет использоваться
Редактировать:
IIS - отстой, поэтому лучший вариант - просто очистить staticTypes и снова добавить все в правильном порядке:
Clear-WebConfiguration -Filter "//system.webServer/httpCompression/staticTypes/add" -PSPath 'IIS:\'
SetCompressionOfMimeType 'text/*' 'True'
SetCompressionOfMimeType 'application/javascript' 'True'
SetCompressionOfMimeType 'image/svg+xml' 'True'
SetCompressionOfMimeType 'text/css' 'True'
SetCompressionOfMimeType '*/*' 'False'
function SetCompressionOfMimeType($mimeType, $enabled){
Write-Output "Setting compression for $mimeType to $enabled"
Add-WebConfiguration -Filter '/system.webServer/httpCompression/staticTypes' -PSPath 'IIS:\' -Value @{mimeType=$mimeType; enabled=$enabled}
}