Почему IIS 7 игнорирует определенные (но не все) типы MIME для сжатия? Ошибка выдачи: DYNAMIC_COMPRESSION_NOT_SUCCESS - Причина 12

11

Итак, я немного 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 ***
Питер Элерт
источник
1
ИСПОЛЬЗУЙТЕ NOTEPAD для редактирования applicationHost.config. Я потратил несколько часов, прежде чем понял, что мои изменения, сделанные в notepad ++ (а также в редакторе Visual Studio 2010 !!), не применяются IIS. Альтернативный способ добавить дополнительный mimeType в коллекцию dynamicTypes / staticTypes - использовать appcmd. "C:\Windows\System32\Inetsrv\Appcmd.exe" set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/javascript',enabled='True']" /commit:apphostИ снова: после внесенных изменений - вы увидите их только в блокноте. Блокнот ++ (а также редактор Visual Studio 2010 !!)
Саша
Александр, я не уверен на 100%, что понимаю, что вы здесь говорите, но я могу с уверенностью сказать, что изменение конфигурации IIS с помощью любого текстового редактора работает просто отлично. У вас могут возникнуть проблемы с редактором, который добавляет маркер спецификации, но в остальном все должно быть в порядке. В моем случае это было не то, что я не мог использовать блокнот для редактирования, просто я редактировал не тот файл. Не все изменения конфигурации могут быть сделаны в файле web.config, который находится в корне веб-приложения. Некоторые должны быть сделаны против appHost в системной папке.
Питер Элерт
6
@alexander: Да, использование 32-битных приложений, таких как notepad ++ или visual studio, в 64-битных окнах заставит WOW64 инициировать перенаправление файлов для папки System32. Редактирование создаст клон в C: \ WINDOWS \ SysWOW64, видимый только для 32-битных программ, и никогда не будет использоваться IIS, который является 64-битной программой
Фредрик Хаглунд,
Блокнот на самом деле работает ... Блокнот ++ и Visual Studio перенаправляются.
Брайан Уайт
@FredrikHaglund Святой курит. Я бы предложил поместить этот комментарий в свой ответ с некоторым объяснением ... Я понятия не имел, что произойдет нечто подобное, и преследовал бы мой хвост еще много часов, если бы я не видел ваш комментарий. (Рекомендую также Сашу и Брайана Уайта, которые также упомянули эту проблему, но ваш комментарий, похоже, ближе всего к сути проблемы.)
Беска

Ответы:

7

Хорошо, оказывается, вы не можете настроить это в web.config, только appHost.config. Я предположил, что в документации написано appHost.config, но я предположил, что это спецификация общей концепции, а не единственное допустимое расположение конфигурации.

Питер Элерт
источник
Верный. Конфигурация system.webServer не позволяет использовать httpCompression на уровне веб-сайта. Вы можете настроить то же самое в корне, то есть в applicationhost.config.
Вивек Кумбхар
хм ... документы говорят, что это может быть применено на уровне web.config - прокрутите вниз: msdn.microsoft.com/en-us/library/ms690689(v=vs.90).aspx и посмотрите на "Местоположения конфигурации" таблица .. Это проблема в документации?
avs099 12.12.13
@ avs099 Я не знаю. Когда я опубликовал это 3 года назад, я уверен, что начал с web.config, и я написал, что он не работает. Возможно, функциональность изменена в патче или документы не верны. Было бы хорошо, чтобы проверить, чтобы узнать.
Питер Элерт
1
о - может быть, я не совсем понял - то, как я читаю документацию, говорит, что httpCompression МОЖЕТ использоваться в web.config, - но я не смог заставить его работать, поэтому я также изменил файл applicationHost.config. Для меня это выглядит как документация вводит в заблуждение. Я
свяжу
Смотрите мой ответ - по умолчанию чистая установка IIS отключает web.configпереопределения настроек сжатия, поэтому вам нужно изменить applicationHost.config. Вместо того, чтобы изменять там параметры сжатия, вы можете просто разрешить переопределения, и вы снова в деле.
mcw
3

Питер, спасибо за подсказку - мы также нашли эту настройку

<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>
Джефф Этвуд
источник
3

После новой установки мой applicationHost.config(in %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.

MCW
источник
Трассировка невыполненных запросов была очень полезна для меня при устранении неполадок: iis.net/learn/troubleshoot/using-failed-request-tracing/…
mcw
Это не работает вообще для IIS8 +. У вас есть какой-нибудь опыт, заставляющий httpCompressionэлемент работать на web.configуровне в новых версиях IIS, или это невозможно? Документы - это кошмар - в них, похоже, ничего не говорится о том, что сделка является официальной.
17
@theyetiman - извините, я вообще не работал с IIS8 +. Удачи.
17
0

Чтобы добавить отсутствующие mimetypes из 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}
}
Marius
источник