c# gzip asp.net-web-api2

c# - Web API Gzip no se aplica



asp.net-web-api2 (7)

¿Está la WebAPI detrás de un Firewall, Proxy Web, Virus Protection Suite? Como se mencionó en Sitios web aún más rápidos: Mejores prácticas de rendimiento para desarrolladores web Por Steve Souders Esto podría estar eliminando los encabezados.

He agregado la entrada web.config para habilitar la compresión gzip basada en esta respuesta S / O Habilitar gzip de IIS7 .

Luego verifiqué la ventana de Chrome Developer mientras cargaba una página ASPX y vi el encabezado en la respuesta:

Cache-Control:private Content-Encoding:gzip Content-Length:3669 Content-Type:text/html; charset=utf-8 Date:Wed, 04 Mar 2015 00:46:05 GMT Server:Microsoft-IIS/7.5 Vary:Accept-Encoding X-AspNet-Version:4.0.30319 X-Powered-By:ASP.NET

Entonces eso significa que está "funcionando", ¿correcto? Pero cuando se busca ese encabezado al realizar una llamada a la API web, no está presente:

Cache-Control:no-cache Content-Length:551 Content-Type:application/json; charset=utf-8 Date:Wed, 04 Mar 2015 00:53:05 GMT Expires:-1 Pragma:no-cache Server:Microsoft-IIS/7.5 X-AspNet-Version:4.0.30319 X-Powered-By:ASP.NET

He intentado todo tipo de configuraciones diferentes (comenzando con la recomendada en la respuesta de S / O vinculada anterior). Finalmente, en un acto de desesperación, lo configuré para esto, lo cual pensé que lo haría intentar comprimir todas las solicitudes (todo excepto * / * comentado):

<httpCompression directory="%SystemDrive%/inetpub/temp/IIS Temporary Compressed Files"> <scheme name="gzip" dll="%Windir%/system32/inetsrv/gzip.dll"/> <dynamicTypes> <add mimeType="*/*" enabled="true"/> <!--<add mimeType="text/*" enabled="true"/> <add mimeType="message/*" enabled="true"/> <add mimeType="application/javascript" enabled="true"/> <add mimeType="application/json" enabled="true"/>--> <!--<add mimeType="*/*" enabled="false"/> --> </dynamicTypes> <staticTypes> <add mimeType="*/*" enabled="true"/> <!--<add mimeType="text/*" enabled="true"/> <add mimeType="message/*" enabled="true"/> <add mimeType="application/javascript" enabled="true"/> <add mimeType="application/json" enabled="true"/>--> <!-- add mimeType="*/*" enabled="false"/>--> </staticTypes> </httpCompression> <urlCompression doStaticCompression="true" doDynamicCompression="true"/>

¿Qué puede impedir que se aplique el GZIP a mis métodos de API web?

Actualizar

Desde entonces, probé el paquete de compresión de la API de NuGet Web y edité el archivo ApplicationHost.config en IIS Express 8.0 (Visual Studio) y en un IIS 7.5 instalado localmente. Todos han obtenido los mismos resultados: solicitudes de otros tipos de mime como text / * work, pero application / json se niega a ser comprimido.


Creo que @Peeticus estaba en el camino correcto.

Aquí está lo que hice para que funcione:

Después de ejecutar "Install-Package Microsoft.AspNet.WebApi.MessageHandlers.Compression" o agregarlo a través de la GUI, necesita actualizar /App_Start/WebApiConfig.cs

Se requieren las siguientes declaraciones de uso adicionales:

using Microsoft.AspNet.WebApi.MessageHandlers.Compression.Compressors; using Microsoft.AspNet.WebApi.MessageHandlers.Compression;

Agregue lo siguiente dentro del método WebApiConfig.Register:

GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new ServerCompressionHandler(new GZipCompressor(), new DeflateCompressor()));

A continuación, en la aplicación IISExpressHost.config, busque el elemento <httpCompression> <dynamicTypes> y lo siguiente antes del predeterminado <add mimeType = " / " enabled = "false" />

<add mimeType="application/json" enabled="true" />

También en la actualización applicationHost.config <urlCompression /> para

<urlCompression doDynamicCompression="true" />


Creo que has hecho todos los deberes en el lado del servidor, pero el problema está en la solicitud.

Para permitir que el servidor comprima la respuesta, es necesario incluir este encabezado en la solicitud :

Accept-Encoding: gzip, deflate

Si no lo hace, no importa lo que haga en el lado del servidor, la respuesta nunca se comprimirá.

No especifica cuál es su cliente de API web, pero siempre hay una manera de agregar encabezados en la solicitud utilizando la API de cliente.



En su implementación del paquete NuGet Microsoft.AspNet.WebApi.MessageHandlers.Compression, ¿agregó la línea requerida (abajo) a su archivo App_Start / WebApiConfig.cs? Tenga en cuenta que debe estar después de todos los demás manejadores de mensajes en el mismo método, según las instrucciones en el sitio de inicio del paquete.

GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new ServerCompressionHandler(new GZipCompressor(), new DeflateCompressor()));

Aquí hay un ejemplo de método de registro de un archivo WebApiConfig que usé en un blog:

public static void Register(HttpConfiguration config) { // Web API configuration and services // Web API routes config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { echo = RouteParameter.Optional } ); GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new ServerCompressionHandler(new GZipCompressor(), new DeflateCompressor())); }

Esta es la publicación del blog que mencioné: .Net Web API Compression


Gracias a las 2 soluciones anteriores y otras soluciones en otros lugares, pensé que una explicación paso a paso de cómo obtener la compresión http que funciona con Web API 2.2 podría ser beneficiosa, ya que algunos paquetes / espacios de nombres han cambiado desde las publicaciones anteriores.

1) Usando la consola de nuget package manager instale lo siguiente;

Install-Package Microsoft.AspNet.WebApi.MessageHandlers.Compression

2) Dentro de WebApiConfig.cs agregue estos usos;

using System.Net.Http.Extensions.Compression.Core.Compressors; using Microsoft.AspNet.WebApi.Extensions.Compression.Server;

3) Dentro de WebApiConfig.cs, agregue a la parte inferior del Registro (configuración de HttpConfiguration);

GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new ServerCompressionHandler(new GZipCompressor(), new DeflateCompressor()));

4) Edite su web.config y dentro de system.webServer add;

<urlCompression doStaticCompression="true" doDynamicCompression="true" dynamicCompressionBeforeCache="true" /> <httpCompression> <dynamicTypes> <clear /> <add enabled="true" mimeType="text/*" /> <add enabled="true" mimeType="message/*" /> <add enabled="true" mimeType="application/x-javascript" /> <add enabled="true" mimeType="application/javascript" /> <add enabled="true" mimeType="application/json" /> <add enabled="false" mimeType="*/*" /> <add enabled="true" mimeType="application/atom+xml" /> </dynamicTypes> <staticTypes> <clear /> <add enabled="true" mimeType="text/*" /> <add enabled="true" mimeType="message/*" /> <add enabled="true" mimeType="application/javascript" /> <add enabled="true" mimeType="application/atom+xml" /> <add enabled="true" mimeType="application/xaml+xml" /> <add enabled="true" mimeType="application/json" /> <add enabled="false" mimeType="*/*" /> </staticTypes> </httpCompression>

¡Trabajé por primera vez en un sitio web local y azul así que espero que funcione para ti! Además, ciertamente no hay necesidad de meterse con applicationHost.config ...


Primero.

IIS ignora la compresión de respuesta de la API WEB porque las respuestas de la API son del tipo mime

application/json; charset=utf-8

Las configuraciones predeterminadas de Compresión IIS no incluyen este tipo de Mime, por lo que no comprimen la respuesta.

Así que tienes que agregar este tipo mime a la sección <dynamicTypes>

<add mimeType="application/json; charset=utf-8" enabled="true" />

(O solo para probarlo, como lo hizo <add mimeType="*/*" enabled="true" /> )

PERO

Por defecto, la <httpCompression> está bloqueada por IIS para la configuración desde afuera.

¡Así que cualquier configuración que especifique en su web.config se ignorará !

A menos que especifique esta configuración en la sección applicationHost.config <httpCompression> O edite la sección <httpCompression> para permitir la configuración desde afuera.

<section name="httpCompression" allowDefinition="MachineToApplication" overrideModeDefault="Allow" />