wake-up-neo.com

Aktivieren Sie die HTTP-Komprimierung mit der ASP.NET-Web-API

Wir stellen Dateien für eine Website aus unserer Asp .NET-Web-API bereit:

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);
        });
    }
}

Ich möchte die HTTP-Komprimierung aktivieren. Laut dieser MSDN-Dokumentation

Verwenden Sie serverbasierte Antwortkomprimierungstechnologien in IIS, Apache oder Nginx, bei denen die Leistung der Middleware wahrscheinlich nicht mit der der Servermodule übereinstimmt. Verwenden Sie Response Compression Middleware, wenn Sie nicht verwenden können:

  • IIS Dynamic Compression-Modul

  • Apache mod_deflate-Modul

  • NGINX-Komprimierung und Dekomprimierung

  • HTTP.sys-Server (früher WebListener genannt)

  • Turmfalke

Ich denke, der erste vorzuziehende Weg, dies in meiner Instanz zu tun, ist mit dem IIS Dynamic Compression Module. Dementsprechend habe ich dies in meiner Web.config als Test ausprobiert und folgte diesem Beispiel :

<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>

Die Antwortheader enthalten jedoch nicht Content-Encoding, daher glaube ich nicht, dass sie komprimiert werden. Was vermisse ich? Wie kann ich dies so einstellen, dass die Komprimierung optimal genutzt wird?

Ich habe bestätigt, dass mein Client einen Accept-Encoding-Header von gzip, deflate, br sendet.

Aktualisieren

Ich habe versucht, die dynamische HTTP-Komprimierung in IIS zu installieren, da diese nicht standardmäßig installiert ist. Es scheint mir, als versuche ich, Inhalte statisch zu liefern, aber ich dachte, das wäre einen Versuch wert. Ich habe überprüft, dass sowohl die statische als auch die dynamische Inhaltskomprimierung in IIS Manager aktiviert ist. Ich habe es aber nochmal ohne Komprimierung ausgeführt.

Update 2

Ich erkannte, dass die Komprimierung auf unseren Azure-Servern funktionierte, aber immer noch nicht mit meinem lokalen IIS.

13
Scott H

Ich habe Ihr Startup in einem leeren 4.7 .NET-Webprojekt ausprobiert und bekomme zumindest auf index.html eine Komprimierung. Ich habe die dynamische Komprimierung installiert, einige Owin-Pakete, web.config unten usw. hinzugefügt, damit es funktioniert. Verwendung von 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 (funktionierte für mich ohne 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 (abgekürzt)

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" });
                }
            };
            ...
            }
    }
}

Antwort

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

Ich habe festgestellt, dass diese drei Ressourcen bei der Konfiguration der dynamischen Komprimierung für IIS auf ASP.Net WCF- und Web-API-Seiten hilfreich sind. Ich nehme an, dass es auch für .Net Core funktioniert, aber ich habe es noch nicht versucht. Die ersten beiden sind ein bisschen alt, aber die Prinzipien gelten immer noch:

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

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

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

Speziell:

  • Ja, Sie benötigen das Dynamic HTTP Compression-Modul, das in IIS installiert und aktiviert ist
  • Stellen Sie sicher, dass die dynamische Komprimierung im IIS Manager unter [Ihr Server]/Compression: ausgewählt ist. Enable Dynamic Compression
  • Überprüfen Sie noch einmal, ob der MIME-Typ im Anforderungsheader des Clients im Konfigurationseditor unter system.webServer/httpCompression/dynamicTypes/ speziell hinzugefügt wurde und dass die Eigenschaft "Enabled" des Typhandlers auf "True" gesetzt ist.
  • Fügen Sie die web.config-Einträge wie in den obigen Links und in der anderen Antwort beschrieben hinzu
0
pcdev

Wahrscheinlich ist dies, was auf Ihrem Windows Server fehlt (ich gehe davon aus, dass Sie auf Server-Os arbeiten) die Installation von Webserver IIS. Leistungsmerkmale, in denen zwei Untermodule installiert werden können: Static Content Conpression und Dynamic Content Compression

Um zu überprüfen, ob sie installiert sind, führen Sie den Server-Manager aus. Wählen Sie Add Roles and Features aus, wählen Sie Ihre Instanz aus, und klicken Sie in Bildschirm Server Roles auf die Baumknoten Web Server (IIS), Web Server, Performance. Überprüfen Sie, ob die Kontrollkästchen Static Content Conpression und Dynamic Content Compression installiert sind. Wiederholen Sie dann alle Konfigurationsschritte für die Konfiguration der statischen und dynamischen Komprimierung im IIS - Manager und in den Website-Einstellungen. Es sollte jetzt klappen.

0