web-dev-qa-db-ja.com

ASP.NET Web APIでHTTP圧縮を有効にする

Asp .NET Web APIからWebサイトのファイルを提供します。

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

HTTP圧縮を有効にしたい。 このMSDNドキュメント によると

ミドルウェアのパフォーマンスがサーバーモジュールのパフォーマンスとおそらく一致しないIIS、Apache、またはNginxでサーバーベースの応答圧縮技術を使用します。使用できない場合は、応答圧縮ミドルウェアを使用します。

  • IIS動的圧縮モジュール

  • Apache mod_deflateモジュール

  • NGINX圧縮と解凍

  • HTTP.sysサーバー(以前の名前はWebListener)

  • チョウゲンボウ

したがって、私のインスタンスでこれを行うための最初の好ましい方法は、IIS動的圧縮モジュールを使用することです。したがって、テストとして、これをWeb.configで試しました this例

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

ただし、応答ヘッダーにはContent-Encodingが含まれていないため、圧縮されているとは思わない。何が欠けていますか?可能な限り最良の方法で圧縮を提供するためにこれをどのように設定できますか?

クライアントがAccept-Encodinggzip, deflate, brヘッダーを送信していることを確認しました。

更新

IISはデフォルトではインストールされないため、動的HTTP圧縮をインストールしようとしました。コンテンツを静的に提供しようとしているようですが、これは試す価値があると思いました。両方を確認しましたIIS Managerでは静的および動的なコンテンツ圧縮が有効になっています。ただし、再実行しましたが、まだ圧縮は行われていません。

アップデート2

Azureサーバーでは圧縮が機能しているのに、ローカルIISではまだ機能していないことに気付きました。

13
Scotty H

空の4.7 .NET Webプロジェクトでスタートアップを試しましたが、少なくともindex.htmlで圧縮を取得しました。動的圧縮をインストールし、いくつかのOwinパッケージ、web.configなどを追加して機能させました。 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(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(省略)

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

応答

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

これらの3つのリソースは、ASP.Net WCFおよびWeb APIページのいずれかでIISの動的圧縮を構成するのに役立ちます。NetCoreでも機能すると思いますが、まだ使用していません。最初の2つは少し古いですが、原則はまだ適用されます。

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/

具体的には:

  • はい、動的HTTP圧縮モジュールがIISにインストールされ、有効になっている必要があります
  • IIS Manager in[Your server]/CompressionEnable Dynamic Compression
  • クライアントのリクエストヘッダーのMIMEタイプがsystem.webServer/httpCompression/dynamicTypes/の下の構成エディターに明確に追加されていること、およびタイプハンドラーのEnabledプロパティがTrueに設定されていることを再確認します。
  • 上記のリンクで概説されているweb.configエントリと他の回答を追加します
0
pcdev

ほとんどの場合、これはWindowsサーバー(サーバーOsで作業していると思います)で欠落しているもので、WebサーバーのインストールIISでインストールできる2つのサブモジュール(Static Content ConpressionおよびDynamic Content Compression)のパフォーマンス機能です。

インストールされているかどうかを確認するには、サーバーマネージャーを実行し、Add Roles and Featuresを選択し、インスタンスを選択します。画面Server RolesでツリーノードWeb Server (IIS)Web ServerPerformanceを展開し、チェックボックスにStatic Content ConpressionDynamic Content Compressionがインストールされていることを確認します。機能のインストール。次に、IIS ManagerおよびWebサイト設定で、静的および動的圧縮構成のすべてのセットアップ手順を繰り返します。これで動作するはずです。

0