usar texto servidor recursos pagina habilitar habilita con comprimir compresión compresion como json gzip azure http-compression

json - texto - Cómo habilitar la compresión HTTP de gzip en el contenido dinámico de Windows Azure



habilitar gzip en apache (6)

Acabo de tener un problema con el tipo de error 183 y encontré una solución. Entonces, si alguien más está experimentando esto, aquí va:

Aquí está el error que obtuve:

El programa de usuario "F: / approot / bin / EnableCompression.cmd" salió con un código de salida 18 distinto de cero. El directorio de trabajo es F: / approot / bin.

Y aquí está el código que me lo arregló:

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%

Solución encontrada en http://msdn.microsoft.com/en-us/library/azure/hh974418.aspx

Intenté sin éxito habilitar la compresión HTTP de gzip en mi servicio WCF restful alojado en Windows Azure, que devuelve JSON solo de las solicitudes GET y POST.

He intentado tantas cosas que me resultaría difícil enumerarlas todas, y ahora me doy cuenta de que he estado trabajando con información contradictoria (con respecto a la versión anterior de azul, etc.), ¡así que creo que es mejor empezar con un borrón y cuenta nueva!

Estoy trabajando con Visual Studio 2008, utilizando las herramientas de febrero de 2010 para Visual Studio.

Entonces, según el siguiente link ...

.. La compresión HTTP ahora ha sido habilitada. He usado el consejo en la siguiente página (el consejo de compresión de URL solamente) ..

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

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

..pero no tengo compresión. No ayuda que no sé cuál es la diferencia entre urlCompression y httpCompression . ¡Intenté averiguarlo pero fue en vano!

¿Podría ser un problema el hecho de que las herramientas para Visual Studio se lanzaron antes de la versión de Azure que admite la compresión? He leído en alguna parte que, con las herramientas más recientes, puede elegir qué versión del sistema operativo Azure desea usar cuando la publica ... pero no sé si eso es cierto, y si lo es, no puedo encontrar dónde elegir. ¿Podría estar usando una versión habilitada para pre-http?

También probé el módulo de compresión http de blowery, pero no obtuve ningún resultado.

¿Alguien tiene algún consejo actualizado sobre cómo lograr esto? es decir, consejos relacionados con la versión actual del sistema operativo Azure.

¡Aclamaciones!

Steven

Actualización: edité el código anterior para corregir un tipo en el fragmento web.config.

Actualización 2: probar las respuestas utilizando la URL de whatsmyip que se muestra en la respuesta a continuación muestra que mis respuestas JSON de mi service.svc se están devolviendo sin ninguna compresión, pero las páginas HTML estáticas se devuelven con compresión gzip. Cualquier consejo sobre cómo obtener las respuestas JSON para comprimir será recibido con gratitud!

Actualización 3: Intenté una respuesta JSON de más de 256 KB para ver si el problema se debía a que la respuesta JSON era más pequeña que esta, como se menciona en los comentarios a continuación. Lamentablemente, la respuesta aún no está comprimida.


Bueno, al menos no estoy solo en este caso, y sigue siendo un estúpido PITA casi un año después.

El problema es un desajuste tipo MIME. WCF devuelve la respuesta JSON con Content-Type: application/json; charset=UTF-8 Content-Type: application/json; charset=UTF-8 . La configuración predeterminada de IIS , aproximadamente a la mitad de esa página, no incluye eso como un tipo MIME compresible.

Ahora, podría ser tentador agregar una sección <httpCompression> a su web.config, y agregar application / json a eso. Pero esa es solo una mala forma de desperdiciar una o dos buenas horas: solo puede cambiar el elemento <httpCompression> en el nivel applicationHost.config.

Entonces hay dos soluciones posibles. Primero, podría cambiar su respuesta WCF para usar un tipo MIME que sea compresible en la configuración predeterminada. text/json funcionará, por lo que agregar esto a su (s) método (s) de servicio le dará compresión dinámica: WebOperationContext.Current.OutgoingResponse.ContentType = "text/json";

Alternativamente, puede cambiar el archivo applicationHost.config usando appcmd y una tarea de inicio. Esto se discute (entre otras cosas) en este hilo . Tenga en cuenta que si agrega esa tarea de inicio y la ejecuta en el tejido dev, funcionará una vez. La segunda vez fallará porque ya ha agregado el elemento de configuración. Terminé creando un segundo proyecto en la nube con un archivo csdef separado, para que mi devfabric no ejecutara ese script de inicio. Sin embargo, probablemente haya otras soluciones.

Actualizar

Mi sugerencia para proyectos separados en el párrafo anterior no es realmente una buena idea. Las tareas de inicio no ideopotentes son una muy mala idea, porque algún día el tejido de Azure decidirá reiniciar tus roles para ti, la tarea de inicio fallará y entrará en un ciclo de reciclaje. Muy probablemente en el medio de la noche. En cambio, haga que sus tareas de inicio sean idempotentes como se discutió en este hilo SO .


Bueno, tomó mucho tiempo ... pero finalmente he resuelto esto, y quiero publicar la respuesta para cualquier otra persona que esté luchando. ¡La solución es muy simple y he verificado que definitivamente funciona!

Edite su archivo ServiceDefinition.csdef para contener esto en la etiqueta WebRole:

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

En su rol web, cree un archivo de texto y guárdelo como "EnableCompression.cmd"

EnableCompression.cmd debería contener esto:

%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

.. ¡y eso es! ¡Hecho! Esto permite la compresión dinámica para el json devuelto por la función web, que creo que he leído en algún lugar tiene un tipo de mime bastante extraño, así que asegúrese de copiar el código exactamente.



Para tratar el tejido de desarrollo local con problemas después del primer despliegue, agregué los comandos apropiados al archivo CMD para restablecer la configuración. Además, estoy configurando el nivel de compresión aquí específicamente, ya que parece predeterminado a cero en algunos (¿todos?) Casos.

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


Sí, puede elegir el sistema operativo que desee, pero de forma predeterminada obtendrá la última.

La compresión es difícil. Hay muchas cosas que pueden salir mal. ¿Estás haciendo esta prueba por casualidad detrás de un servidor proxy? Creo que IIS por defecto no envía contenido comprimido a los proxies. Encontré una herramienta útil para probar si la compresión funciona cuando estaba jugando con esto: http://www.whatsmyip.org/http_compression/ .

Parece que tienes doDynamicCompression = "false" ... ¿es solo un error tipográfico? Desea que esté activado si va a obtener compresión en JSON que devuelve de un servicio web.