Как включить сжатие HTTP gzip в динамическом содержимом Windows Azure



я безуспешно пытался включить сжатие HTTP gzip на моей службе Windows Azure hosted WCF Restful, которая возвращает JSON только из запросов GET и POST.



Я пробовал так много вещей, что мне было бы трудно перечислить их все, и теперь я понимаю, что работаю с противоречивой информацией (относительно старой версии azure и т. д.), Поэтому думаю, что лучше начать с чистого листа!



Я работаю с Visual Studio 2008, используя февраль 2010 инструменты для Visual Studio.



Итак, согласно следующему ссылке..



.. Теперь включено сжатие HTTP. Я использовал совет на следующей странице (только Совет по сжатию URL)..



http://blog.smarx.com/posts/iis-compression-in-windows-azure



<urlCompression doStaticCompression="true" 
doDynamicCompression="true"
dynamicCompressionBeforeCache="true"
/>


.. но я не получаю никакого сжатия. Это не помогает, что я не знаю, в чем разница между urlCompression и httpCompression. Я пытался выяснить, но безрезультатно!



может ли быть проблемой тот факт, что инструменты для Visual Studio были выпущены до версии Azure, которая поддерживает сжатие? Я где-то читал, что с помощью последних инструментов вы можете выбрать, какую версию ОС Azure вы хотите использовать при публикации ... но я не знаю, правда ли это, и если да, то я не могу найти, где выбрать. Могу ли я использовать версию с поддержкой pre-http?



Я также пробовал модуль сжатия http blowery, но результатов нет.



есть ли у кого-нибудь современные советы о том, как этого достичь? т. е. совет, который относится к текущей версии ОС Azure.



Ура!



Стивен



обновление: я отредактировал выше код, чтобы исправить тип в интернете.фрагмент конфигурации.



обновление 2: тестирование ответов с помощью URL-адреса whatsmyip, показанного в ответе ниже, показывает, что мои ответы JSON от моего сервиса.svc возвращаются без какого-либо сжатия, но статические HTML-страницы ARE возвращается с помощью сжатия gzip. Любые советы о том, как получить ответы JSON для сжатия будут с благодарностью получены!



обновление 3: попробовал ответ JSON больше, чем 256KB, чтобы увидеть, была ли проблема из-за того, что ответ JSON был меньше, чем это, как указано в комментариях ниже. К сожалению ответ все еще есть без сжатия.

642   6  

6 ответов:

Ну это заняло очень долгое время ... но я, наконец, решил это, и я хочу опубликовать ответ для всех, кто борется. Решение очень простое и я проверил, что это работает!!

редактировать ServiceDefinition.csdef файл, чтобы содержать это в теге WebRole:

    <Startup>
      <Task commandLine="EnableCompression.cmd" executionContext="elevated" taskType="simple"></Task>
    </Startup>

в вашей веб-роли создайте текстовый файл и сохраните его как "EnableCompression.cmd"

EnableCompression.УМК должен содержать это:

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

.. и это все! Готово! Это позволяет динамическое сжатие для json, возвращаемого веб-ролью, которая, как мне кажется, я где-то читал, имеет довольно странный тип mime, поэтому убедитесь, что вы точно копируете код.

ну, по крайней мере, я не одинок в этом - и это все еще глупая Пита почти год спустя.

проблема заключается в несоответствии типа MIME. WCF возвращает ответ JSON с помощью Content-Type: application/json; charset=UTF-8. Элемент конфигурация IIS по умолчанию, примерно на полпути вниз по этой странице, не включает это как сжимаемый тип MIME.

теперь, это может быть заманчивым, чтобы добавить <httpCompression> Раздел для вашего интернета.config и добавьте к этому application/json. Но это просто плохой способ тратить целый час или два - вы можете только изменить <httpCompression> элемент на applicationHost.уровень конфигурации.

таким образом, есть два возможных решения. Во-первых, вы можете изменить свой ответ WCF, чтобы использовать тип MIME, который сжимается в конфигурации по умолчанию. text/json будет работать, поэтому добавление этого в ваш метод (ы) службы даст вам динамическое сжатие:WebOperationContext.Current.OutgoingResponse.ContentType = "text/json";

кроме того, вы можете изменить applicationHost.конфигурационный файл с помощью appcmd и задачи запуска. Это обсуждается (среди другие вещи) на этой теме. Обратите внимание, что если вы добавите эту задачу запуска и запустите ее в dev fabric, она будет работать один раз. Второй раз это не удастся, потому что вы уже добавили элемент конфигурации. В итоге я создал второй облачный проект с отдельным файлом csdef, чтобы мой devfabric не запускал этот сценарий запуска. Хотя, возможно, есть и другие решения.

обновление

мое предложение для отдельных проектов в предыдущем абзаце не очень хорошая идея. Неидемпотентные задачи запуска-это очень плохая идея, потому что когда-нибудь Azure fabric решит перезапустить ваши роли для вас, задача запуска не будет выполнена, и она войдет в цикл рециркуляции. Скорее всего, в середине ночи. Вместо этого сделайте ваши задачи запуска идемпотентными, как описано в это так нити.

чтобы справиться с локальной структурой разработки, имеющей проблемы после первого развертывания, я добавил соответствующие команды в файл CMD для сброса конфигурации. Кроме того, я устанавливаю уровень сжатия здесь специально, так как он по умолчанию равен нулю в некоторых (все?) случаи.

REM Remove old settings - keeps local deploys working (since you get errors otherwise)
%windir%\system32\inetsrv\appcmd reset config -section:urlCompression
%windir%\system32\inetsrv\appcmd reset config -section:system.webServer/httpCompression 

REM urlCompression - is this needed?
%windir%\system32\inetsrv\appcmd set config -section:urlCompression /doDynamicCompression:True /commit:apphost
REM Enable json mime type
%windir%\system32\inetsrv\appcmd set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/json; charset=utf-8',enabled='True']" /commit:apphost

REM IIS Defaults
%windir%\system32\inetsrv\appcmd set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='text/*',enabled='True']" /commit:apphost
%windir%\system32\inetsrv\appcmd set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='message/*',enabled='True']" /commit:apphost
%windir%\system32\inetsrv\appcmd set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/x-javascript',enabled='True']" /commit:apphost
%windir%\system32\inetsrv\appcmd set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='*/*',enabled='False']" /commit:apphost
%windir%\system32\inetsrv\appcmd set config -section:system.webServer/httpCompression /+"staticTypes.[mimeType='text/*',enabled='True']" /commit:apphost
%windir%\system32\inetsrv\appcmd set config -section:system.webServer/httpCompression /+"staticTypes.[mimeType='message/*',enabled='True']" /commit:apphost
%windir%\system32\inetsrv\appcmd set config -section:system.webServer/httpCompression /+"staticTypes.[mimeType='application/javascript',enabled='True']" /commit:apphost
%windir%\system32\inetsrv\appcmd set config -section:system.webServer/httpCompression /+"staticTypes.[mimeType='*/*',enabled='False']" /commit:apphost

REM Set dynamic compression level to appropriate level.  Note gzip will already be present because of reset above, but compression level will be zero after reset.
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"[name='deflate',doStaticCompression='True',doDynamicCompression='True',dynamicCompressionLevel='7',dll='%%Windir%%\system32\inetsrv\gzip.dll']" /commit:apphost
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression -[name='gzip'].dynamicCompressionLevel:7 /commit:apphost

эта статья из MS-это их сценарий для JSON http://msdn.microsoft.com/en-us/library/windowsazure/hh974418.aspx.

Он имеет дело со многими из упомянутых проблем, например, возможность обрабатывать Azure recycle и т. д.

просто была проблема с этим относительно типа ошибки 183, и я нашел решение. Так что если кто-то еще испытывает это здесь идет:

вот ошибка, которую я получил:

пользовательская программа "F:\approot\bin\EnableCompression.cmd " вышел с ненулевым кодом выхода 183. Рабочий каталог есть F:\approot\bin.

и вот код, который исправил это для меня:

REM   *** Add a compression section to the Web.config file. ***
%windir%\system32\inetsrv\appcmd set config /section:urlCompression /doDynamicCompression:True /commit:apphost >> "%TEMP%\StartupLog.txt" 2>&1

REM   ERRORLEVEL 183 occurs when trying to add a section that already exists. This error is expected if this
REM   batch file were executed twice. This can occur and must be accounted for in a Windows Azure startup
REM   task. To handle this situation, set the ERRORLEVEL to zero by using the Verify command. The Verify
REM   command will safely set the ERRORLEVEL to zero.
IF %ERRORLEVEL% EQU 183 DO VERIFY > NUL

REM   If the ERRORLEVEL is not zero at this point, some other error occurred.
IF %ERRORLEVEL% NEQ 0 (
   ECHO Error adding a compression section to the Web.config file. >> "%TEMP%\StartupLog.txt" 2>&1
   GOTO ErrorExit
)

REM   *** Add compression for json. ***
%windir%\system32\inetsrv\appcmd set config  -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/json; charset=utf-8',enabled='True']" /commit:apphost >> "%TEMP%\StartupLog.txt" 2>&1
IF %ERRORLEVEL% EQU 183 VERIFY > NUL
IF %ERRORLEVEL% NEQ 0 (
   ECHO Error adding the JSON compression type to the Web.config file. >> "%TEMP%\StartupLog.txt" 2>&1
   GOTO ErrorExit
)

REM   *** Exit batch file. ***
EXIT /b 0

REM   *** Log error and exit ***
:ErrorExit
REM   Report the date, time, and ERRORLEVEL of the error.
DATE /T >> "%TEMP%\StartupLog.txt" 2>&1
TIME /T >> "%TEMP%\StartupLog.txt" 2>&1
ECHO An error occurred during startup. ERRORLEVEL = %ERRORLEVEL% >> "%TEMP%\StartupLog.txt" 2>&1
EXIT %ERRORLEVEL%

решение найдено по http://msdn.microsoft.com/en-us/library/azure/hh974418.aspx

Да, вы можете выбрать нужную ОС, но по умолчанию вы получите последнюю версию.

сжатие сложнее. Есть много вещей, которые могут пойти не так. Вы случайно не делаете это тестирование за прокси-сервером? Я считаю, что IIS по умолчанию не отправляет сжатый контент прокси. Я нашел удобный инструмент, чтобы проверить, работает ли сжатие, когда я играл с этим:http://www.whatsmyip.org/http_compression/.

похоже, что у вас есть doDynamicCompression= "false"... это просто опечатка? Вы хотите, чтобы это было включено, если вы собираетесь получить сжатие в JSON, которое вы возвращаете из веб-службы.

Comments

    Ничего не найдено.