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.
De acuerdo con ASP.NET Web API Compression (Ben Foster Blog) tiene dos opciones:
Cambia tu
applicationHost.config
y agregaa la sección httpCompression -> dynamicTypes.
Use un controlador de delegación en su canal de api web para manejar la compresión.
por ejemplo, Fabrik.Common o Microsoft ASP.NET Web API Compression Compression
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" />