c# asp.net compression gzip

c# - ¿Cómo implementar la compresión GZip en ASP.NET?



compression (8)

Agregue la extensión .aspx al archivo .css o .js. Utilice <% @ Page ContentType = "text / css"%> o javascript dentro del archivo para publicarlo con el tipo MIME correcto. y use Reescribir URL para ocultar esto de los navegadores del agente de usuario. El encabezado de respuesta de codificación de contenido se adjunta gzip para transmitir que gzip es el método utilizado para realizar la compresión. Variar encabezado de respuesta establecido en Aceptar-Codificación para que todos los cachés sepan qué página (comprimida o no comprimida) debe ser servida depende del encabezado Aceptación-Codificación de la solicitud. He elaborado sobre esto en https://stackoverflow.com/a/14509007/1624169

Estoy intentando implementar la compresión GZip para mi página asp.net (incluidos mis archivos CSS y JS). Probé el siguiente código, pero solo comprime mi página .aspx (lo encontré en YSlow )

HttpContext context = HttpContext.Current; context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress); HttpContext.Current.Response.AppendHeader("Content-encoding", "gzip"); HttpContext.Current.Response.Cache.VaryByHeaders["Accept-encoding"] = true;

El código anterior solo está comprimiendo mi código de página .aspx (marcado), no los archivos CSS y JS que se incluyen como archivos externos. Dígame cómo puedo implementar la compresión GZip en ASP.NET usando código (porque estoy en el servidor de alojamiento compartido donde no tengo acceso a las configuraciones del Servidor IIS). Y también en el código anterior no estoy obteniendo las dos últimas líneas, por qué se usan y cuál es el propósito de estas líneas. ¡Por favor explique!

Gracias


Aquí está la solución para css y javascript

<httpCompression> <scheme name="gzip" dll="%Windir%/system32/inetsrv/gzip.dll"/> <dynamicTypes> <add mimeType="text/*" enabled="true"/> <add mimeType="message/*" enabled="true"/> <add mimeType="application/javascript" enabled="true"/> <add mimeType="*/*" enabled="false"/> </dynamicTypes> <staticTypes> <add mimeType="text/*" enabled="true"/> <add mimeType="message/*" enabled="true"/> <add mimeType="application/javascript" enabled="true"/> <add mimeType="*/*" enabled="false"/> </staticTypes> </httpCompression> <urlCompression doStaticCompression="true" doDynamicCompression="true"/> </system.webServer>

Crédito: Cómo GZip en ASP.NET y GoDaddy


En IIS7, todas las solicitudes van a .net, por lo que debería crear un HttpModule que agregara esos encabezados a todas las respuestas.

Sin IIS7, y en alojamiento compartido, tendría que crear un controlador que asignara una extensión de archivo .net que no esté usando (como .asmx) y en el archivo web.config especifique que los archivos .asmx van a su HttpHandler que está configurado para volver a escribir el camino a .jpg o lo que sea y establecer el encabezado allí también.


La razón por la que solo está comprimiendo su archivo ASPX es porque el código que ha escrito solo está incrustado en el archivo ASPX. Un archivo ASPX es una solicitud separada de cualquier contenido vinculado que contiene. Entonces, si tiene una página ASPX que contiene:

<img src="www.example.com/exampleimg.jpg" alt="example" />

Esto equivaldría a 2 solicitudes (búsquedas de DNS a un lado) de su navegador a los recursos:

  1. para la página aspx y
  2. para la imagen contenida en la página aspx.

Cada solicitud tiene su propia respuesta de vapor. El código que ha publicado se adjunta únicamente a la secuencia de respuesta ASPX, por lo que solo se está comprimiendo su página ASPX. Las líneas 1 y 2 del código publicado básicamente toman el flujo de respuesta normal de la página e inyectan un código de "intermediario" que en este caso come y comprime el flujo de salida normal con un flujo GZip y lo envía por el cable.

Las líneas 3 y 4 están configurando los encabezados de respuesta. Todas las solicitudes y respuestas http tienen encabezados que se envían antes del contenido. Estos configuran la solicitud / respuesta para que el servidor y el cliente sepan qué se envía y cómo.

En este caso, la línea 3 informa al navegador del cliente que el flujo de respuesta se comprime a través de gzip y, por lo tanto, debe ser descomprimido por el navegador del cliente antes de su visualización.

Y la Línea 4 simplemente está activando el encabezado Aceptar-Codificar de la respuesta. Esto, de otro modo, habría estado ausente de la respuesta.

Hay módulos enchufables que puede escribir / obtener que le permiten comprimir una multitide de otro tipo MIME, como * .js y * .css, pero es mejor que simplemente utilice la funcionalidad de compresión integrada de IIS.

No ha dicho qué versión de IIS está utilizando, pero si fuera IIS 7.0, sería necesario que incluya algo como lo siguiente en la sección <system.webserver> de su archivo web.config:

<httpCompression> <scheme name="gzip" dll="%Windir%/system32/inetsrv/gzip.dll" /> <staticTypes> <add mimeType="text/*" enabled="true" /> </staticTypes> </httpCompression> <urlCompression doStaticCompression="true" />

..

Ricardo


Para comprimir archivos JS y CSS, tiene que manejar eso en el nivel IIS, ya que estos archivos se representan directamente sin el tiempo de ejecución de ASP.NET.

Puede hacer una asignación de extensiones JSX y CSSX en IIS a aspnet_isapi.dll y luego aprovechar su código postal, pero es probable que IIS haga un mejor trabajo para usted.

El encabezado de codificación de contenido le dice al navegador que necesita descomprimir el contenido antes de renderizarlo. Algunos navegadores son lo suficientemente inteligentes como para resolver esto de todos modos, según la forma del contenido, pero es mejor simplemente contarlo.

La configuración de caché de codificación de aceptación está allí para que una versión en caché del contenido comprimido no se envíe a un navegador que solo solicitó texto / html.


Para responder tu última pregunta. Esas dos líneas establecen encabezados HTTP para la respuesta enviada de vuelta al navegador. Content-Encoding le dice al navegador que la respuesta está codificada como gzip y necesita ser decodificada. La última línea agrega Accept-Encoding al encabezado Vary . Con esto, el navegador o los proxies pueden determinar si la respuesta fue única o está influenciada por ciertos otros encabezados y ajustar su almacenamiento en caché.


Puede agregar lo siguiente a su archivo web.config dentro del elemento <system.webServer> :

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

NOTA: Si está utilizando una versión anterior de IIS (menos de v7.5), es posible que desee establecer doDynamicCompression en falso porque el proceso requirió mucha CPU. Estos problemas se aclararon en IIS 7.5.

Referencia: https://docs.microsoft.com/en-us/iis/configuration/system.webserver/urlcompression


esto puede ser útil para que lo pruebes, esto acepta la compresión desinflar y gzip.

void Application_PreRequestHandlerExecute(object sender, EventArgs e) { HttpApplication app = sender as HttpApplication; string acceptEncoding = app.Request.Headers["Accept-Encoding"]; Stream prevUncompressedStream = app.Response.Filter; if (app.Context.CurrentHandler == null) return; if (!(app.Context.CurrentHandler is System.Web.UI.Page || app.Context.CurrentHandler.GetType().Name == "SyncSessionlessHandler") || app.Request["HTTP_X_MICROSOFTAJAX"] != null) return; if (acceptEncoding == null || acceptEncoding.Length == 0) return; acceptEncoding = acceptEncoding.ToLower(); if (acceptEncoding.Contains("deflate") || acceptEncoding == "*") { // deflate app.Response.Filter = new DeflateStream(prevUncompressedStream, CompressionMode.Compress); app.Response.AppendHeader("Content-Encoding", "deflate"); } else if (acceptEncoding.Contains("gzip")) { // gzip app.Response.Filter = new GZipStream(prevUncompressedStream, CompressionMode.Compress); app.Response.AppendHeader("Content-Encoding", "gzip"); } }