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.
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=\"Web\" /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
...
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://docs.Microsoft.com/en-us/iis/configuration/system.webserver/httpcompression/
Plus précisément:
system.webServer/httpCompression/dynamicTypes/
et que la propriété Enabled
du gestionnaire de types est définie sur True
.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.