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




3 Answers

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

Измените файл ServiceDefinition.csdef, чтобы он содержался в теге WebRole:

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

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

EnableCompression.cmd должен содержать следующее:

%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, поэтому обязательно скопируйте код.

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

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

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

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

.. 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 OS вы хотите использовать при публикации ... но я не знаю, правда ли это, и если да, то я не могу найти, где выбирать. Могу ли я использовать версию с поддержкой до HTTP?

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

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

Ура!

Стивен

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

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

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




Чтобы иметь дело с локальной технологией разработки, имеющей проблемы после первого развертывания, я добавил соответствующие команды в файл 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



Просто была проблема с этим в отношении типа ошибки 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




Related

json gzip azure http-compression