web-dev-qa-db-fra.com

Activer la compression HTTP avec API Web ASP.NET

Nous servons des fichiers pour un site Web à partir de notre API Web Asp .NET:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var clientHostname = System.Configuration.ConfigurationManager.AppSettings["ClientHostname"];

        var staticFileOptions = new StaticFileOptions()
        {
            OnPrepareResponse = staticFileResponseContext =>
            {
                staticFileResponseContext.OwinContext.Response.Headers.Add("Cache-Control", new[] { "public", "max-age=0" });
            }
        };

        app.MapWhen(ctx => ctx.Request.Headers.Get("Host").Equals(clientHostname), app2 =>
        {
            app2.Use((context, next) =>
            {
                if (context.Request.Path.HasValue == false || context.Request.Path.ToString() == "/") // Serve index.html by default at root
                {
                    context.Request.Path = new PathString("/Client/index.html");
                }
                else // Serve file
                {
                    context.Request.Path = new PathString($"/Client{context.Request.Path}");
                }

                return next();
            });

            app2.UseStaticFiles(staticFileOptions);
        });
    }
}

Je veux activer la compression HTTP. Selon cette documentation MSDN

Utilisez les technologies de compression des réponses basées sur le serveur dans IIS, Apache ou Nginx où les performances du middleware ne correspondront probablement pas à celles des modules de serveur. Utilisez Response Compression Middleware lorsque vous ne pouvez pas utiliser:

  • Module de compression dynamique IIS

  • Module Apache mod_deflate

  • Compression et décompression NGINX

  • Serveur HTTP.sys (anciennement appelé WebListener)

  • Crécerelle

Je pense donc que la première façon préférable de faire cela dans mon cas est d'utiliser le module de compression dynamique IIS. En conséquence, j'ai essayé ceci dans mon Web.config, à titre de test, en suivant cet exemple :

<configuration>
  <system.webServer>
    <httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
      <dynamicTypes>
        <add mimeType="*/*" enabled="true" />
      </dynamicTypes>
      <staticTypes>
        <add mimeType="*/*" enabled="true" />
      </staticTypes>
    </httpCompression>
  </system.webServer>
</configuration>

Cependant, les en-têtes de réponse n'incluent pas Content-Encoding, donc je ne pense pas qu'il soit compressé. Qu'est-ce que je rate? Comment puis-je configurer cela pour servir avec compression de la meilleure façon possible?

J'ai vérifié que mon client envoie un en-tête Accept-Encoding de gzip, deflate, br.

Mettre à jour

J'ai essayé d'installer la compression HTTP dynamique dans IIS car elle n'est pas installée par défaut. Il me semble que j'essaie de servir du contenu de manière statique, mais je pensais que cela valait la peine d'essayer. J'ai vérifié que la compression de contenu statique et dynamique était activée dans IIS Manager. Cependant, je l'ai relancé mais toujours pas de compression.

Mise à jour 2

J'ai réalisé que la compression fonctionnait sur nos serveurs Azure mais pas avec mes IIS locaux.

13
Scott H

J'ai essayé votre démarrage dans un projet Web 4.7 vide. 4.7. La compression, du moins sur index.html J'ai installé la compression dynamique, ajouté plusieurs packages Owin, web.config ci-dessous, etc. Utiliser IIS/10 

packages.config

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.5" targetFramework="net47" />
  <package id="Microsoft.Net.Compilers" version="2.1.0" targetFramework="net47" developmentDependency="true" />
  <package id="Microsoft.Owin" version="3.1.0" targetFramework="net47" />
  <package id="Microsoft.Owin.FileSystems" version="3.1.0" targetFramework="net47" />
  <package id="Microsoft.Owin.Host.SystemWeb" version="3.1.0" targetFramework="net47" />
  <package id="Microsoft.Owin.StaticFiles" version="3.1.0" targetFramework="net47" />
  <package id="Owin" version="1.0" targetFramework="net47" />
</packages>

Web.config (a travaillé pour moi sans httpCompression)

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  https://go.Microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
  <appSettings>
    <add key="ClientHostname" value="localhost" />
    <add key="owin:appStartup" value="WebApplication22.App_Start.Startup" />
  </appSettings>
  <system.web>
    <compilation targetFramework="4.7" />
    <httpRuntime targetFramework="4.7" />
  </system.web>
  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701" />
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
    </compilers>
  </system.codedom>
  <system.webServer>
    <httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
      <dynamicTypes>
        <add mimeType="*/*" enabled="true" />
      </dynamicTypes>
      <staticTypes>
        <add mimeType="*/*" enabled="true" />
      </staticTypes>
    </httpCompression>
  </system.webServer>
</configuration>

Startup.cs (abrégé)

using Microsoft.Owin;
using Microsoft.Owin.StaticFiles;
using Owin;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace WebApplication22.App_Start
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            var clientHostname = System.Configuration.ConfigurationManager.AppSettings["ClientHostname"];

            var staticFileOptions = new StaticFileOptions()
            {
                OnPrepareResponse = staticFileResponseContext =>
                {
                    staticFileResponseContext.OwinContext.Response.Headers.Add("Cache-Control", new[] { "public", "max-age=0" });
                }
            };
            ...
            }
    }
}

Réponse

HTTP/1.1 200 OK
Cache-Control: public,max-age=0
Content-Type: text/html
Content-Encoding: gzip
Last-Modified: Tue, 17 Oct 2017 22:03:20 GMT
ETag: "1d347b5453aa6fa"
Vary: Accept-Encoding
Server: Microsoft-IIS/10.0
X-Powered-By: ASP.NET
Date: Wed, 18 Oct 2017 02:27:34 GMT
Content-Length: 588
...
2
KnarfaLingus

J'ai trouvé ces trois ressources utiles pour la configuration de la compression dynamique pour IIS sur les pages ASP.Net WCF et Web API. Je suppose que cela fonctionne aussi pour .Net Core mais je n'ai pas encore essayé. Les deux premiers sont un peu vieux mais les principes s'appliquent toujours:

https://blog.arvixe.com/how-to-enable-gzip-on-iis7/

https://www.hanselman.com/blog/EnablingDynamicCompressionGzipDeflateForWCFDataFeedsODataAndOtherCustomServicesInIIS7.aspx }

https://docs.Microsoft.com/en-us/iis/configuration/system.webserver/httpcompression/

Plus précisément:

  • Oui, vous avez besoin du module de compression HTTP dynamique installé dans IIS et activé
  • Assurez-vous que la compression dynamique est cochée dans IIS Manager sous [Votre serveur]/Compression: Enable Dynamic Compression
  • Vérifiez à nouveau que le type MIME dans l'en-tête de demande du client est spécifiquement ajouté dans l'éditeur de configuration sous system.webServer/httpCompression/dynamicTypes/ et que la propriété Enabled du gestionnaire de types est définie sur True.
  • Ajoutez les entrées web.config comme indiqué dans les liens ci-dessus et l'autre réponse.
0
pcdev

Probablement ce qui manque sur votre serveur Windows (je suppose que vous travaillez sur le serveur Os) est l’installation de Web Server IIS Caractéristiques de performance dans lesquelles il existe deux sous-modules pouvant être installés: Static Content Conpression et Dynamic Content Compression

Pour vérifier s'ils sont installés, exécutez Gestionnaire de serveur, sélectionnez Add Roles and Features, sélectionnez votre instance. Dans l'écran Server Roles, développez les noeuds d'arborescence Web Server (IIS), Web Server, Performance et vérifiez si les cases à cocher indiquent que Static Content Conpression et Dynamic Content Compression sont installés. Répétez ensuite toutes les étapes de configuration pour la configuration de la compression statique et dynamique dans le gestionnaire IIS et dans les paramètres du site Web. Cela devrait fonctionner maintenant.

0
Jacek Blaszczynski