Настройка IIS 7.5 для отправки ответов JSON в сжатом виде, NO_MATCHING_CONTENT_TYPE

Итак, я пытаюсь заставить свое приложение отправлять свои ответы JSON с использованием динамического сжатия и gzip. К сожалению, это не работает. Все статическое сжатие на сервере работает нормально, но не динамическое.

Я установил это, добавив:

<add mimeType="application/json" enabled="true" />
<add mimeType="application/json; charset=utf-8" enabled="true" />

В раздел <dynamicTypes> файла <httpCompression> в файле applicationHost.config. Я использую Charles для проверки HTTP-запросов и могу убедиться, что отправляю запросы с установленным заголовком Accept-Encoding: gzip, deflate. Я пробовал и с Accept: */*, и с Accept: application/json. Когда он не работал, я включил ведение журнала трассировки «Неудачный запрос», чтобы найти код ошибки для DYNAMIC_COMPRESSION_NOT_SUCCESS, который был NO_MATCHING_CONTENT_TYPE.

Я пытался исследовать форумы и Google, но все, что я вижу, это люди, которые говорят, что использование mimeType с указанной кодировкой решает проблему для них, но в моем случае это все еще не работает, и я могу проверить, что ответ приходит назад с заголовком "Content-Type: application/json; charset=utf-8"

Конечные точки, которые обслуживают ответы JSON, представляют собой стандартные веб-службы .NET ASMX, помеченные [ScriptService()] в классе и [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] в методе. Они возвращают JSON нормально, но я не могу заставить динамическое сжатие работать на всю жизнь.

Поскольку это обычные веб-методы, я также добавил:

<add mimeType="text/xml" enabled="true" />
<add mimeType="text/xml; charset=utf-8" enabled="true" />

Чтобы попытаться сжать ответы в формате XML. Что разочаровывает, так это то, что это сжатие работает, а отправка JSON из того же метода - нет. На данный момент я немного растерялся.


person Sloloem    schedule 23.07.2012    source источник


Ответы (1)


Вы хотите убедиться, что тип */* mime находится после типов, которые вы добавляете. Также убедитесь, что вы установили модуль динамического сжатия с помощью диспетчера сервера (или OptionalFeatures.exe).

Это командные строки, которые я использую, чтобы обеспечить хорошее сжатие. (но убедитесь, что вы действительно установили модули динамического и статического сжатия):

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/serverRuntime /frequentHitThreshold:"1"
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/urlCompression /doDynamicCompression:"True"

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /-"dynamicTypes.[mimeType='application/json']"
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/json',enabled='True']"

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /-"dynamicTypes.[mimeType='application/json; charset=utf-8']"
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/json; charset=utf-8',enabled='True']"

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /-"dynamicTypes.[mimeType='application/javascript']"
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/javascript',enabled='True']"

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /-"dynamicTypes.[mimeType='application/x-javascript']"
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/x-javascript',enabled='True']"

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /-"dynamicTypes.[mimeType='application/x-javascript; charset=utf-8']"
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/x-javascript; charset=utf-8',enabled='True']"

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /-"dynamicTypes.[mimeType='*/*']"
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='*/*',enabled='False']"

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /-"staticTypes.[mimeType='application/javascript']"
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"staticTypes.[mimeType='application/javascript',enabled='True']"

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /-"staticTypes.[mimeType='application/x-javascript']"
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"staticTypes.[mimeType='application/x-javascript',enabled='True']"

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /-"staticTypes.[mimeType='application/x-javascript; charset=utf-8']"
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"staticTypes.[mimeType='application/x-javascript; charset=utf-8',enabled='True']"

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /-"staticTypes.[mimeType='*/*']"
call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"staticTypes.[mimeType='*/*',enabled='False']"

call %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /noCompressionForHttp10:"False" /noCompressionForProxies:"False" /minFileSizeForComp:"2700"

После запуска ваш% windir% \ system32 \ inetsrv \ config \ ApplicationHost.config должен выглядеть примерно так (обратите внимание, что / находится внизу):

<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files" minFileSizeForComp="2700" noCompressionForHttp10="false" noCompressionForProxies="false">
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" />
    <dynamicTypes>
        <add mimeType="text/*" enabled="true" />
        <add mimeType="message/*" enabled="true" />
        <add mimeType="application/json" enabled="true" />
        <add mimeType="application/json; charset=utf-8" enabled="true" />
        <add mimeType="application/javascript" enabled="true" />
        <add mimeType="application/x-javascript" enabled="true" />
        <add mimeType="application/x-javascript; charset=utf-8" enabled="true" />
        <add mimeType="*/*" enabled="false" />
    </dynamicTypes>
    <staticTypes>
        <add mimeType="text/*" enabled="true" />
        <add mimeType="message/*" enabled="true" />
        <add mimeType="application/atom+xml" enabled="true" />
        <add mimeType="application/xaml+xml" enabled="true" />
        <add mimeType="application/javascript" enabled="true" />
        <add mimeType="application/x-javascript" enabled="true" />
        <add mimeType="application/x-javascript; charset=utf-8" enabled="true" />
        <add mimeType="*/*" enabled="false" />
    </staticTypes>
</httpCompression>
person Carlos Aguilar Mares    schedule 04.03.2013
comment
Спасибо, я действительно решил это некоторое время назад самостоятельно, но я не мог вспомнить, как я это сделал, и с тех пор ушел из компании, в которой я был в то время. Я верю, что теперь он использовал сценарий с этими командами и интегрировал его в определение MSBuild для развертывания приложения. - person Sloloem; 05.03.2013
comment
Я целый день гуглил, почему у меня не работает сжатие. По какой-то причине только запуск вашего скрипта решил мою проблему (установка того же непосредственно в файле apphost не сделала). Спасибо! - person LazyBoy; 17.08.2014
comment
Почему у вас одинаковые типы MIME как в статической, так и в динамической секциях? - person Doug S; 31.10.2015
comment
Эти вызовы сценария спасли мне сегодня жизнь. На самом деле у меня уже был этот раздел в appHost.config ... но когда я применял каждую строку скрипта, он говорил, что не может найти элемент. Итак, это изменило что-то еще, не знаю где, но это работает! - person Stuart Allen; 01.07.2016
comment
Добавление этого решило эту проблему для меня: ‹add mimeType = application / json; charset = utf-8 enabled = true / › - person Uğur Dinç; 05.07.2018
comment
@ carlos-aguilar-mares Знаете ли вы, как мы можем добиться того же, если мы хотим добавить httpcompression и mime в конкретный файл web.config - person Shashank Sood; 27.05.2021