Чому IIS 7 ігнорує певні (але не всі) типи MIME для стиснення? Помилка надання: DYNAMIC_COMPRESSION_NOT_SUCCESS - Причина 12


11

Отже, я трохи IIS7 n00b, але я використовував більшість старих систем IIS, повертаючись до 3. Я намагаюся ввімкнути динамічну компресію, і вона працює, в основному. Він не працює для моїх запитів на обслуговування даних ADO.Net (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
ВИКОРИСТОВУЙТЕ НЕЗАПАСНО для редагування applicationHost.config. Я витрачав кілька годин, перш ніж зрозумів, що мої зміни, внесені в блокнот ++ (як і в редактор Visual Studio 2010 !!), IIS не застосовують. Альтернативний спосіб додавання додаткового mimeType в колекцію динамичних / статичних типів - це використання 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 з будь-яким текстовим редактором працює просто чудово. У вас можуть виникнути труднощі з редактором, який додає маркер BOM, але крім цього він повинен бути добре. У моєму випадку, я не зміг використати блокнот для його редагування, а лише те, що я редагував неправильний файл. Не всі зміни конфігурації можуть бути внесені в web.config, який знаходиться в корінні веб-програми. Деякі з них потрібно виконати проти appHost у системній папці.
Пітер Ехлерт

6
@alexander: Правда, за допомогою 32-розрядних додатків, таких як блокнот ++ або візуальна студія у 64-розрядних вікнах, WOW64 запустить переспрямування файлів для папки System32. Редагування створить клон у C: \ WINDOWS \ SysWOW64, видимих ​​лише для 32-бітних програм, і він ніколи не буде використовуватися IIS, що є 64-розрядною програмою
Fredrik Haglund

Блокнот насправді працює ... Блокнот ++ та 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

@ avs099 Я не знаю. Коли я опублікував це 3 роки тому, я впевнений, що почав з web.config і опублікував b / c, що це не працює. Можливо, в патчі змінилась функціональність або документи неправильно. Було б добре перевірити, щоб дізнатися.
Пітер Ехлерт

1
о - може бути, мені було не зрозуміло - як я читаю документацію, в ній написано, що httpCompression МОЖЕ бути використаний у web.config - але я не зміг змусити його працювати, тому я також змінив файл applicationHost.config. Мені це здається, що документація вводить в оману. Я зв'яжуся моя відповідь на SO тут: stackoverflow.com/a/20552186/1246870
avs099

Дивіться мою відповідь - за замовчуванням чиста установка 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%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.


Невдале відстеження запиту було дуже корисним для мене у вирішенні цього питання: iis.net/learn/troubleshoot/using-failed-request-tracing/…
mcw

Це зовсім не працює для IIS8 +. Чи є у вас досвід отримання httpCompressionелемента для роботи на web.configрівні в нових версіях IIS або це неможливо? Документи - це кошмар - це, здається, не говорить про те, що угода десь офіційна.
onietiman

@theyetiman - вибачте, я взагалі не працював з IIS8 +. Удачі.
mcw

0

Для додавання відсутніх міметипів із powerhell використовуйте наступні команди:

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}
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.