2017-10-13 63 views
14

Mamy służyć plików na stronie internetowej naszej Asp .NET Web API:Włącz kompresję HTTP z ASP.NET Web API

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

Chcę włączyć kompresję HTTP. Według this MSDN documentation

wykorzystywania technologii kompresji odpowiedź serwerowych w IIS, Apache lub Nginx gdzie wydajność middleware prawdopodobnie nie będzie zgodny z modułów serwerowych. Użyj kompresji Response Middleware, gdy jesteś w stanie użyć: moduł

  • IIS kompresji dynamicznej

  • moduł mod_deflate Apache

  • nginx kompresji i dekompresji

  • HTTP.sys serwera (poprzednio zwany WebListener)

  • Pustułka

Więc myślę, że pierwszy korzystny sposób, aby zrobić to w moim przypadku jest z IIS dynamiczny moduł kompresji. W związku z powyższym, próbowałem to w moim Web.config, jako test, po this example:

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

Jednak nagłówki odpowiedzi nie zawierają Content-Encoding, więc nie wierzę, że jest skompresowany. czego mi brakuje? Jak mogę to ustawić, aby jak najlepiej obsługiwać kompresję?

Sprawdziłem, że mój klient wysyła nagłówek Accept-Encoding z gzip, deflate, br.

Aktualizacja

Próbowałem instalacji Dynamiczna Kompresja HTTP w IIS, ponieważ nie jest instalowany domyślnie. Wydaje mi się, że próbuję statycznie obsługiwać zawartość, ale pomyślałem, że warto spróbować. Sprawdziłem, czy kompresja zawartości statycznej i dynamicznej jest włączona w Menedżerze IIS. Jednak ponownie go uruchomiłem, ale nadal nie ma kompresji.

Aktualizacja 2

zdałem sobie sprawę kompresji działa na naszych serwerach nie Azure ale nadal z moim lokalnym IIS.

+1

Zamiast symbolu wieloznacznego dla wszystkich typów, czy wypróbowałeś już określone typy MIME w swojej konfiguracji? – Jasen

+1

@Jasen Tak, mam, niestety bezskutecznie. –

Odpowiedz

2

Próbowałem twojego startupu w pustym projekcie internetowym 4.7 .NET, a kompresuję, przynajmniej na index.html. Zainstalowałem dynamiczną kompresję, dodałem kilka pakietów Owin, web.config poniżej itd., Aby działało. Korzystanie 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 (pracował dla mnie bez 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 (w skrócie)

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

Response

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

znalazłem te trzy zasobów może być przydatna w konfiguracji dynamicznej kompresji IIS po obu stronach ASP.Net WCF i Web API. Zakładam, że działa również dla .Net Core, ale jeszcze nie próbowałem. Pierwsze dwa są nieco stare, ale zasady nadal obowiązują:

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/

Konkretnie:

  • Tak, potrzebujemy moduł dynamiczny HTTP Compression zainstalowane w IIS i włączone:
  • Upewnić się, że dynamiczna kompresja jest sprawdzana w Menedżerze IIS pod [Twój serwer]/Compression: Enable Dynamic Compression
  • dwukrotnie sprawdzić, czy typ MIME w nagłówku żądania klienta jest specjalnie dodane w edytorze konfiguracji pod system.webServer/httpCompression/dynamicTypes/, a typ handler”Enabled właściwość jest ustawiona na True
  • Dodaj wpisy web.config jak wskazano w linkach powyżej i drugą odpowiedź
0

najprawdopodobniej to, czego brakuje na Windows Server (zakładam pracować na serwerze Os) to instalacja sieci Web Server IIS Funkcje wydajności, w których istnieją dwa submoduły, które można zainstalować: Static Content Conpression i Dynamic Content Compression.

Aby sprawdzić, czy są one zainstalowane Server Manager run, wybierz Add Roles and Features wybierz instancję, na ekranie Server Roles poszerzyć węzłów drzewa Web Server (IIS), Web Server, Performance i sprawdzić, czy pola wyboru wskazują, że Static Content Conpression i Dynamic Content Compression są zainstalowane, jeśli nie je sprawdzić i kontynuować instalacja funkcji. Następnie powtórz wszystkie kroki konfiguracji kompresji statycznej i dynamicznej w Menedżerze usług IIS oraz w ustawieniach witryny sieci Web. Teraz powinno działać.

+0

Mój system operacyjny to Windows 10 Home, więc nie jestem pewien, gdzie znaleźć Menedżera serwera? –

+0

OK to nieco zmienia problem i sprawia, że ​​moja powyższa odpowiedź jest bezużyteczna. Aby sprawdzić, czy masz wymagane funkcje w IIS, przejdź do Panelu sterowania -> Program i funkcje -> Włącz lub wyłącz funkcje systemu Windows -> znajdź węzeł Internetowych usług informacyjnych i rozwiń go -> rozwiń węzeł Usługi World Wide Web -> rozwiń Funkcje wydajności węzeł - i sprawdź, czy oba pola wyboru dla kompresji zawartości dynamicznej i statycznej są zaznaczone -> jeśli nie, sprawdź je i kontynuuj instalację. –