web-dev-qa-db-fra.com

API Web Gzip non appliquée

J'ai ajouté l'entrée web.config pour activer la compression gzip basée sur cette réponse S/O Activer IIS7 gzip .

J'ai ensuite vérifié la fenêtre du développeur Chrome lors du chargement d'une page ASPX et j'ai vu l'en-tête dans la réponse: 

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

Donc ça veut dire que ça marche, correct? Mais lorsque vous recherchez cet en-tête lors de l'appel d'un API Web, il n'est pas présent:

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

J'ai essayé toutes sortes de configurations différentes (à commencer par celle recommandée dans la réponse S/O liée ci-dessus). Enfin, dans un acte de désespoir, je l'ai mis à ceci, que je pensais le ferait essayer d'essayer de comprimer tout demandes (tout sauf */* commenté):

  <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'est-ce qui peut empêcher l'application de GZIP à mes méthodes d'API Web?

Mise à jour

Depuis, j'ai essayé à la fois le package de compression de l'API Web NuGet et la modification du fichier applicationHost.config dans IIS Express 8.0 (Visual Studio) et un IIS installé localement. . Tous ont donné les mêmes résultats: les requêtes pour d'autres types MIME comme text/* fonctionnent, mais application/json refuse d'être gzippé.

18
FirstDivision

WebAPI se trouve-t-il derrière un pare-feu, un proxy Web et une suite de protection antivirus? Comme mentionné dans Sites Web encore plus rapides: Meilleures pratiques en matière de performances pour les développeurs Web Par Steve Souders Cela pourrait supprimer les en-têtes.

11
Paul

Grâce aux 2 solutions ci-dessus et à d’autres solutions ailleurs, j’ai pensé qu’une explication étape par étape sur la façon de faire fonctionner la compression http avec Web API 2.2 pourrait être utile, car quelques packages/espaces de noms ont changé depuis les publications ci-dessus.

1) À l’aide de la console du gestionnaire de paquets de nuget, installez ce qui suit:

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

2) À l'intérieur de WebApiConfig.cs, ajoutez ces utilisations;

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

3) Dans WebApiConfig.cs, ajoutez en bas de Register (configuration HttpConfiguration);

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

4) Editez votre web.config et à l'intérieur 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>

Vous avez travaillé pour la première fois sur un site local et sur un site Web Azure, alors espérons que cela fonctionnera pour vous! Plus certainement pas besoin de jouer avec applicationHost.config ...

4
alv

Selon Compression des API Web ASP.NET (blog Ben Foster) vous avez deux options:

  1. Changez votre applicationHost.config et ajoutez 

    vers httpCompression -> section dynamicTypes.

  2. Utilisez un gestionnaire de délégation dans votre pipeline API Web pour gérer la compression.
    par exemple. Fabrik.Common ou Compression des API Web ASP.NET de Microsoft

4
Stefan Ossendorf

Je pense que @Peeticus était sur la bonne voie. 

Voici ce que j'ai fait pour que cela fonctionne:

Après avoir exécuté "Install-Package Microsoft.AspNet.WebApi.MessageHandlers.Compression" ou en l'ajoutant via l'interface graphique, vous devez mettre à jour /App_Start/WebApiConfig.cs.

Les instructions using supplémentaires suivantes sont obligatoires:

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

Ajoutez ce qui suit dans la méthode WebApiConfig.Register:

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

Ensuite, dans IISExpress applicationHost.config, recherchez l'élément <dynamicTypes> de <httpCompression> et les éléments suivants avant l'élément par défaut <add mimeType = "/" enabled = "false" /> 

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

De même, dans la mise à jour applicationHost.config <urlCompression /> 

<urlCompression doDynamicCompression="true" />
3
Dane W

Je pense que vous avez fait tous les devoirs du côté serveur, mais le problème réside dans la demande.

Pour permettre au serveur de compresser la réponse, il est nécessaire que inclue cet en-tête dans la requête :

Accept-Encoding: gzip, deflate

Si vous ne le faites pas, quoi que vous fassiez côté serveur, la réponse ne sera jamais compressée.

Vous ne spécifiez pas quel est votre client API Web, mais il existe toujours un moyen d'ajouter des en-têtes dans la demande à l'aide de l'API client.

3
JotaBe

Dans votre implémentation du package NuGet Microsoft.AspNet.WebApi.MessageHandlers.Compression, avez-vous ajouté la ligne requise (ci-dessous) à votre fichier App_Start\WebApiConfig.cs? Notez que c'est après tous les autres gestionnaires de messages de la même méthode, conformément aux instructions du site d'origine du package.

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

Voici un exemple de méthode Register d'un fichier WebApiConfig que j'ai utilisé dans 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()));
    }

C'est l'article de blog que j'ai mentionné: .Net Web API Compression

1
Peeticus

En premier. 

IIS ignore la compression des réponses de l'API Web, car les réponses de l'API Web sont de type mime

application/json; charset=utf-8

Par défaut IIS Paramètres de compression n'inclut pas ce type Mime afin de ne pas compresser la réponse.

Donc, vous devez ajouter ce type mime à la section <dynamicTypes>

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

(Ou juste pour le tester, comme vous l'avez fait <add mimeType="*/*" enabled="true" />)

MAIS

Par défaut<httpCompression>Section est verrouillée par IIS pour les réglages extérieurs !! 

Ainsi, tous les paramètres que vous spécifiez sur votre web.config recevront ignored !

Sauf si vous spécifiez ces paramètres dans la section applicationHost.config <httpCompression> OR Modifiez la section <httpCompression> pour autoriser les paramètres extérieurs.

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