Jak włączyć kompresję GZIP HTTP w Windows Azure dynamic content

Próbowałem bezskutecznie włączyć kompresję HTTP gzip na moim Windows Azure hosted WCF Restful service, która zwraca JSON tylko z żądań GET I POST.

Próbowałem tak wielu rzeczy, że trudno mi byłoby wymienić wszystkie z nich, a teraz zdaję sobie sprawę, że pracuję z sprzecznymi informacjami (dotyczącymi starej wersji platformy azure itp.), Więc myślę, że najlepiej zacząć od czystej karty!

[1]}pracuję z Visual Studio 2008, korzystając z narzędzi luty 2010 dla Visual Studio.

Tak więc, zgodnie z poniższym linkiem ..

.. Kompresja HTTP została włączona. Skorzystałem z porad na następującej stronie (tylko porady dotyczące kompresji adresu URL)..

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

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

.. ale nie mam kompresji. Nie pomaga to, że nie wiem, jaka jest różnica między kompresją url A httpcompresją . Próbowałem się dowiedzieć, ale nie / align = "left" /

Czy fakt, że narzędzia dla Visual Studio zostały wydane przed wersją platformy Azure, która obsługuje kompresję, może być problemem? Czytałem gdzieś, że dzięki najnowszym narzędziom możesz wybrać wersję platformy Azure OS, której chcesz użyć podczas publikowania ... ale nie wiem, czy to prawda, a jeśli tak, nie mogę znaleźć, gdzie wybrać. Czy Mogę używać wersji pre-http?

Próbowałem również modułu kompresji http blowery, ale bez rezultatów.

Czy jakiekolwiek ktoś ma jakieś aktualne rady jak to osiągnąć? tj. porady odnoszące się do bieżącej wersji systemu operacyjnego Azure.

Zdrówko!

Steven

Aktualizacja: edytowałem powyższy kod, aby naprawić typ w sieci.Config snippet.

Aktualizacja 2: testowanie odpowiedzi za pomocą adresu URL whatsmyip pokazanego w Odpowiedzi poniżej pokazuje, że moje odpowiedzi JSON z mojej usługi.svc są zwracane bez żadnej kompresji, ale statyczne strony HTML jest zwracany z kompresją gzip. Wszelkie porady dotyczące tego, jak uzyskać odpowiedzi JSON na compress, zostaną z wdzięcznością otrzymane!

Update 3: próbowałem odpowiedzi JSON większej niż 256KB, aby sprawdzić, czy problem był spowodowany tym, że odpowiedź JSON jest mniejsza niż ta, jak wspomniano w komentarzach poniżej. Niestety odpowiedź nadal nie jest skompresowana.

Author: WitVault, 2010-05-05

6 answers

Zajęło to bardzo dużo czasu ... ale w końcu to rozwiązałem i chcę opublikować odpowiedź dla każdego, kto ma problemy. Rozwiązanie jest bardzo proste i sprawdziłam, że zdecydowanie działa!!

Edytuj swoją definicję usługi.plik csdef zawierający to w tagu WebRole:

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

W swojej roli internetowej Utwórz plik tekstowy i zapisz go jako " EnableCompression.cmd "

EnableCompression.cmd powinno zawierać:

%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

.. i to wszystko! Zrobione! Umożliwia to dynamiczną kompresję dla json zwracanego przez web-role, który chyba gdzieś czytałem ma dość dziwny typ mime, więc upewnij się, że skopiujesz Kod dokładnie.

 73
Author: Steven Elliott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-11 00:56:03

No przynajmniej nie jestem w tej sprawie sama - a to i tak głupia PITA prawie rok później.

Problem polega na niedopasowaniu typu MIME. WCF zwraca odpowiedź JSON za pomocą Content-Type: application/json; charset=UTF-8. Domyślna konfiguracja IIS , mniej więcej w połowie tej strony, nie uwzględnia tego jako kompresowalnego typu MIME.

Teraz może być kuszące dodanie <httpCompression> sekcji do swojej sieci.config i dodaj do tego application / json. Ale to po prostu zły sposób na zmarnowanie dobrej godziny lub dwóch - możesz tylko zmienić element <httpCompression> w applicationHost.poziom konfiguracji.

Są więc dwa możliwe rozwiązania. Po pierwsze, możesz zmienić odpowiedź WCF na typ MIME, który jest kompresowalny w domyślnej konfiguracji. text/json będzie działać, więc dodanie tego do Twoich metod serwisowych da ci dynamiczną kompresję: WebOperationContext.Current.OutgoingResponse.ContentType = "text/json";

Alternatywnie możesz zmienić applicationHost.plik konfiguracyjny przy użyciu appcmd i zadania startowego. Jest to omówione (między innymi) na ten wątek . Zauważ, że jeśli dodasz to zadanie startowe i uruchomisz je w dev fabric, zadziała ono raz. Za drugim razem się nie powiedzie, ponieważ już dodałeś element konfiguracji. Skończyło się na stworzeniu drugiego projektu chmury z oddzielnym plikiem csdef, aby mój devfabric nie uruchomił tego skryptu startowego. Są jednak prawdopodobnie inne rozwiązania.

Update

Moja sugestia dotycząca oddzielnych projektów w poprzednim akapicie nie jest zbyt dobrym pomysłem. Nie idempotentne zadania startowe są bardzo złe idea, ponieważ pewnego dnia Usługa Azure fabric zdecyduje się ponownie uruchomić twoje role, zadanie startowe nie powiedzie się i przejdzie w pętlę recyklingu. Najprawdopodobniej w środku nocy. Zamiast tego, aby zadania startowe idempotent, jak omówiono na ten wątek.

 13
Author: Brian Reischl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:06

Aby poradzić sobie z problemami local development fabric po pierwszym wdrożeniu, dodałem odpowiednie polecenia do pliku CMD, aby zresetować konfigurację. Ponadto ustawiam tutaj poziom kompresji, ponieważ w niektórych (wszystkie?) cases.

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
 4
Author: scolestock,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-09 19:44:13

Ten artykuł od MS jest ich jak skrypt dla JSON http://msdn.microsoft.com/en-us/library/windowsazure/hh974418.aspx .

Zajmuje się wieloma wymienionymi problemami, np. obsługą usługi Azure recycle itp

 3
Author: GraemeMiller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-21 17:10:39

Właśnie miałem z tym problem dotyczący błędu typu 183 i znalazłem rozwiązanie. Więc jeśli ktoś jeszcze tego doświadcza tutaj idzie:

Oto mój błąd:

Program użytkownika "F:\approot\bin\EnableCompression.cmd " zakończony niezerowym kodem wyjścia 183. Working Directory to F:\approot\bin.

A oto kod, który mi to naprawił:

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%

Rozwiązanie Znalezione w http://msdn.microsoft.com/en-us/library/azure/hh974418.aspx

 3
Author: Blizwire,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-25 03:15:11

Tak, możesz wybrać system operacyjny, który chcesz, ale domyślnie otrzymasz najnowszy.

Kompresja jest trudna. Jest wiele rzeczy, które mogą pójść nie tak. Czy przypadkiem wykonujesz te testy za serwerem proxy? Wierzę, że IIS domyślnie nie wysyła skompresowanej zawartości do Proxy. Znalazłem przydatne narzędzie, aby sprawdzić, czy kompresja działa, gdy grałem z tym: http://www.whatsmyip.org/http_compression/.

Wygląda na to, że masz doDynamicCompression= "false"... czy to tylko literówka? Chcesz, aby to było włączone, jeśli masz zamiar uzyskać kompresję na JSON wracasz z serwisu internetowego.

 0
Author: smarx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-05 20:31:27