ASP.NET Core での応答圧縮

ネットワーク帯域幅はリソースが限られています。 通常、応答のサイズを小さくすると、アプリの応答性が大幅に向上します。 ペイロードサイズを減らす方法の1つは、アプリの応答を圧縮することです。

サンプル コードを表示またはダウンロードします (ダウンロード方法)。

応答圧縮ミドルウェアを使用する場合

IIS、Apache、または Nginx のサーバーベースの応答圧縮テクノロジを使用します。 ミドルウェアのパフォーマンスがサーバーモジュールのパフォーマンスと一致しない場合があります。 HTTP.sys サーバーKestrel サーバーでは、現在、組み込みの圧縮サポートは提供されていません。

次の場合に応答圧縮ミドルウェアを使用します。

応答圧縮

通常、ネイティブに圧縮されていない応答は、応答圧縮の恩恵を受けることができます。 ネイティブに圧縮されていない応答には、通常、CSS、JavaScript、HTML、XML、JSON が含まれます。 PNG ファイルなど、ネイティブに圧縮されたアセットを圧縮することはできません。 ネイティブに圧縮された応答をさらに圧縮しようとすると、サイズと転送時間の小さな減少は、圧縮の処理にかかった時間によって大きく変わる可能性があります。 約 150 から 1000 バイト未満のファイルは圧縮しない (ファイルの内容と圧縮の効率に応じて)。 小さいファイルを圧縮するオーバーヘッドにより、圧縮されていないファイルよりも大きい圧縮ファイルが生成される可能性があります。

クライアントが圧縮されたコンテンツを処理できる場合、クライアントはヘッダーを要求と一緒に送信することで、その機能をサーバー Accept-Encoding に通知する必要があります。 サーバーは、圧縮されたコンテンツを送信するときに、圧縮された応答のエンコード方法に関する情報を ヘッダー Content-Encoding に含める必要があります。 ミドルウェアでサポートされているコンテンツ エンコードの指定を次の表に示します。

Accept-Encoding ヘッダー値 サポートされているミドルウェア 説明
br あり (既定) Brotli 圧縮データ形式
deflate No DEFLATE 圧縮データ形式
exi No W3C 効率的な XML インターチェンジ
gzip はい Gzip ファイル形式
identity はい "エンコードなし" 識別子: 応答をエンコードする必要があります。
pack200-gzip No Java アーカイブのネットワーク転送形式
* はい 明示的に要求されていない使用可能なコンテンツ エンコード

詳細については、「IANA Official Content Coding List 」 を参照してください

ミドルウェアを使用すると、カスタム ヘッダー値の圧縮プロバイダーを Accept-Encoding 追加できます。 詳細については、以下の「 カスタム プロバイダー」を参照 してください。

ミドルウェアは、圧縮スキームに優先順位を付けるクライアントによって送信された場合に、品質値 (qvalue、) の重み付け q に対応できます。 詳細については 、「RFC 7231: Accept-Encoding 」を参照してください

圧縮アルゴリズムは、圧縮速度と圧縮の効果のトレードオフの影響を受けます。 このコンテキストの 効果 は、圧縮後の出力のサイズを示します。 最小サイズは 最適 な圧縮によって実現されます。

次の表では、圧縮されたコンテンツの要求、送信、キャッシュ、および受信に関連するヘッダーについて説明します。

ヘッダー Role
Accept-Encoding クライアントからサーバーに送信され、クライアントが使用できるコンテンツエンコーディングスキームを示します。
Content-Encoding ペイロード内のコンテンツのエンコードを示すために、サーバーからクライアントに送信されます。
Content-Length 圧縮が発生すると、 Content-Length 応答が圧縮されるときに本文の内容が変更されるため、ヘッダーは削除されます。
Content-MD5 圧縮が行われると、 Content-MD5 本文の内容が変更され、ハッシュが有効でなくなったため、ヘッダーは削除されます。
Content-Type コンテンツの MIME の種類を指定します。 すべての応答で、を指定する必要があり Content-Type ます。 ミドルウェアは、この値をチェックして、応答を圧縮する必要があるかどうかを判断します。 ミドルウェアはエンコードできる既定の mime の種類 のセットを指定しますが、mime の種類を置き換えたり追加したりすることができます。
Vary の値がであるサーバーからクライアントとプロキシに送信された場合 Accept-Encoding 、ヘッダーは、 Vary 要求のヘッダーの値に基づいて応答をキャッシュ (変更) する必要があることをクライアントまたはプロキシに示し Accept-Encoding ます。 ヘッダーを使用してコンテンツを返すと、 Vary: Accept-Encoding 圧縮された応答と圧縮されていない応答の両方が個別にキャッシュされることになります。

サンプルアプリを使用して、応答圧縮ミドルウェアの機能を検証します。 このサンプルでは、次のことを示します。

  • Gzip およびカスタム圧縮プロバイダーを使用したアプリ応答の圧縮。
  • 圧縮する mime の種類の既定の一覧に MIME の種類を追加する方法について説明します。

Package

応答圧縮ミドルウェアは、AspNetCore アプリ ASP.NET Core に暗黙的に含まれる ResponseCompression パッケージによって提供されます。

構成

次のコードは、既定の MIME の種類と圧縮プロバイダー(Brotli と Gzip) に対して応答圧縮ミドルウェアを有効にする方法 を示しています

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddResponseCompression();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseResponseCompression();
    }
}

メモ:

  • app.UseResponseCompression は、応答を圧縮するミドルウェアの前に呼び出す必要があります。 詳細については、「ASP.NET Core のミドルウェア」を参照してください。
  • Fiddler、FirefoxBrowser Developer、Postmanなどのツールを使用して、要求ヘッダーを設定し、応答ヘッダー、サイズ、本文 Accept-Encoding を調査します。

ヘッダーなしでサンプル アプリに要求を送信し、応答が圧縮 Accept-Encoding されていないのを確認します。 ヘッダー Content-Encoding Vary と ヘッダーは応答に存在しません。

要求の結果を示す Fiddler ウィンドウ。ヘッダーがAccept-Encodingされます。 応答は圧縮されません。

ヘッダー (Brotli 圧縮) を使用してサンプル アプリに要求を送信し、応答が圧縮 Accept-Encoding: br されているのを確認します。 ヘッダー Content-EncodingVary ヘッダーが応答に存在します。

要求の結果を示す Fiddler ウィンドウに、Accept-Encoding値 br が表示されます。 Vary ヘッダーと Content-Encoding ヘッダーが応答に追加されます。 応答は圧縮されます。

プロバイダー

Brotli 圧縮プロバイダー

BrotliCompressionProviderBrotli 圧縮データ形式で応答を圧縮するには、 を使用します

圧縮プロバイダーが に明示的に追加されていない場合 CompressionProviderCollection :

  • Brotli 圧縮プロバイダーは、Gzip 圧縮プロバイダー と共に、圧縮プロバイダーの配列に既定 で追加されます
  • Brotli 圧縮データ形式がクライアントでサポートされている場合、圧縮は既定で Brotli 圧縮になります。 Brotli がクライアントでサポートされていない場合、クライアントで Gzip 圧縮がサポートされている場合、圧縮は既定で Gzip になります。
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();
}

Brotli 圧縮プロバイダーは、圧縮プロバイダーが明示的に追加されている場合に追加する必要があります。

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}

を使用して圧縮レベルを設定します BrotliCompressionProviderOptions 。 Brotli 圧縮プロバイダーは、既定で最も高速な圧縮レベル (CompressionLevel) に設定されています。これにより、圧縮率が最も高くなる可能性があります。 最も効率的な圧縮が必要な場合は、最適な圧縮のためにミドルウェアを構成します。

Compression Level 説明
CompressionLevel 圧縮は、結果の出力が最適に圧縮されない場合でも、できるだけ早く完了する必要があります。
CompressionLevel 圧縮は実行されません。
CompressionLevel 圧縮が完了するまでに時間がかかる場合でも、応答は最適に圧縮される必要があります。
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();

    services.Configure<BrotliCompressionProviderOptions>(options => 
    {
        options.Level = CompressionLevel.Fastest;
    });
}

Gzip 圧縮プロバイダー

を使用して、 GzipCompressionProvider Gzip ファイル形式で応答を圧縮します。

圧縮プロバイダーがに明示的に追加されていない場合は、次のように CompressionProviderCollection なります。

  • Gzip 圧縮プロバイダーは、既定では、 Brotli 圧縮プロバイダーと共に、圧縮プロバイダーの配列に追加されます。
  • Brotli 圧縮データ形式がクライアントでサポートされている場合、圧縮は既定で Brotli 圧縮になります。 Brotli がクライアントでサポートされていない場合、クライアントで Gzip 圧縮がサポートされていると、圧縮の既定値は Gzip になります。
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();
}

圧縮プロバイダーが明示的に追加されている場合は、Gzip 圧縮プロバイダーを追加する必要があります。

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}

圧縮レベルをに設定 GzipCompressionProviderOptions します。 Gzip 圧縮プロバイダーは、既定で最も高速な圧縮レベル (CompressionLevel) に設定されています。これにより、圧縮率が最も高くなる可能性があります。 最も効率的な圧縮が必要な場合は、最適な圧縮のためにミドルウェアを構成します。

Compression Level 説明
CompressionLevel 圧縮は、結果の出力が最適に圧縮されない場合でも、できるだけ早く完了する必要があります。
CompressionLevel.NoCompression 圧縮を実行する必要はありません。
CompressionLevel.Optimal 圧縮の完了に時間がかかる場合でも、応答を最適に圧縮する必要があります。
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();

    services.Configure<GzipCompressionProviderOptions>(options => 
    {
        options.Level = CompressionLevel.Fastest;
    });
}

カスタム プロバイダー

を使用してカスタム圧縮実装を作成します ICompressionProvider 。 は EncodingName 、これが生成するコンテンツ エンコーディングを ICompressionProvider 表します。 ミドルウェアは、この情報を使用して、要求のヘッダーで指定された一覧に基づいて Accept-Encoding プロバイダーを選択します。

サンプル アプリを使用して、クライアントは ヘッダーを使用して要求を送信 Accept-Encoding: mycustomcompression します。 ミドルウェアは、カスタム圧縮実装を使用し、 ヘッダーを含む応答を返 Content-Encoding: mycustomcompression します。 カスタム圧縮の実装を機能するには、クライアントがカスタム エンコードを圧縮解除できる必要があります。

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}
public class CustomCompressionProvider : ICompressionProvider
{
    public string EncodingName => "mycustomcompression";
    public bool SupportsFlush => true;

    public Stream CreateStream(Stream outputStream)
    {
        // Create a custom compression stream wrapper here
        return outputStream;
    }
}

ヘッダーを使用してサンプル アプリに要求を Accept-Encoding: mycustomcompression 送信し、応答ヘッダーを確認します。 ヘッダー VaryContent-Encoding ヘッダーが応答に存在します。 応答本文 (表示されません) は、サンプルによって圧縮されません。 サンプルの クラスに圧縮 CustomCompressionProvider の実装は含め"ない。 ただし、このサンプルでは、このような圧縮アルゴリズムを実装する場所を示しています。

要求の結果を示す Fiddler ウィンドウには、ヘッダーAccept-Encoding mycustomcompression の値が表示されます。 Vary ヘッダーと Content-Encoding ヘッダーが応答に追加されます。

MIME タイプ

ミドルウェアは、圧縮のために既定の MIME の種類のセットを指定します。

  • application/javascript
  • application/json
  • application/xml
  • text/css
  • text/html
  • text/json
  • text/plain
  • text/xml

MIME の種類を応答圧縮ミドルウェア オプションに置き換えるか追加します。 ワイルドカード MIME の種類 ( など text/* ) はサポートされていません。 このサンプルアプリでは、の MIME の種類を追加 image/svg+xml し、ASP.NET Core バナーイメージ (横断幕) を圧縮して提供します。

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}

セキュリティで保護されたプロトコルを使用した圧縮

セキュリティで保護された接続での圧縮された応答は、 EnableForHttps 既定では無効になっているオプションを使用して制御できます。 動的に生成されたページで圧縮を使用すると、 犯罪侵害 攻撃などのセキュリティ上の問題が発生する可能性があります。

Vary ヘッダーを追加する

ヘッダーに基づいて応答を圧縮する場合 Accept-Encoding 、応答の複数の圧縮バージョンと圧縮されていないバージョンが存在する可能性があります。 複数のバージョンが存在し、格納する必要があることをクライアントキャッシュとプロキシキャッシュに指示するために、 Vary ヘッダーに値を追加し Accept-Encoding ます。 ASP.NET Core 2.0 以降では、 Vary 応答が圧縮されるときに、ミドルウェアによってヘッダーが自動的に追加されます。

Nginx リバースプロキシの背後にあるミドルウェアの問題

要求が Nginx によってプロキシされている場合、 Accept-Encoding ヘッダーは削除されます。 ヘッダーを削除すると、 Accept-Encoding ミドルウェアが応答を圧縮できなくなります。 詳細については、「 NGINX: Compression And 伸張」を参照してください。 この問題は、 Nginx (aspnet/BasicMiddleware #123) のパススルー圧縮によって追跡されます。

IIS 動的圧縮の使用

アプリケーションに対して無効にする、アクティブな IIS 動的圧縮モジュールがサーバーレベルで構成されている場合は、 web.config ファイルを追加してモジュールを無効にします。 詳細については、「Disabling IIS modules」 (IIS モジュールの無効化) を参照してください。

トラブルシューティング

FiddlerFirefox Browser DeveloperPostmanなどのツールを使用すると、要求ヘッダーを設定 Accept-Encoding し、応答ヘッダー、サイズ、本文を調べることができます。 既定では、応答圧縮ミドルウェアは、次の条件を満たす応答を圧縮します。

  • Accept-Encodingヘッダーには br 、設定した gzip * カスタム圧縮プロバイダーに一致する値、、、またはカスタムエンコーディングが含まれています。 値は、 identity または品質値 (qvalue, q ) の 0 (ゼロ) に設定することはできません。
  • MIME の種類 ( Content-Type ) は設定する必要があります。また、 で構成されている MIME の種類と一致する必要があります ResponseCompressionOptions
  • 要求には ヘッダーを含め Content-Range "" は含め " は使用されません。
  • 要求では、セキュリティで保護されたプロトコル (https) が応答圧縮ミドルウェア オプションで構成されていない限り、安全でないプロトコル (http) を使用する必要があります。 セキュリティで保護されたコンテンツ の圧縮を有効に するときに、前述の危険性に注意してください。

その他の技術情報

ネットワーク帯域幅は限られたリソースです。 通常、応答のサイズを小きくすると、アプリの応答性が向上します。多くの場合、大幅に増加します。 ペイロード サイズを減らす方法の 1 つは、アプリの応答を圧縮する方法です。

サンプル コードを表示またはダウンロードします (ダウンロード方法)。

応答圧縮ミドルウェアを使用する場合

IIS、Apache、または Nginx でサーバーベースの応答圧縮テクノロジを使用します。 ミドルウェアのパフォーマンスは、おそらくサーバー モジュールのパフォーマンスと一致しません。 HTTP.sysサーバー とサーバーでは Kestrel 、現在、組み込みの圧縮サポートは提供されていません。

次の場合は、応答圧縮ミドルウェアを使用します。

応答圧縮

通常、ネイティブに圧縮されていない応答は、応答圧縮の恩恵を受けることができます。 ネイティブに圧縮されていない応答には、通常、CSS、JavaScript、HTML、XML、JSON が含まれます。 PNG ファイルなど、ネイティブに圧縮されたアセットを圧縮することはできません。 ネイティブ圧縮応答をさらに圧縮しようとすると、サイズが小さく、転送時間が短縮されると、圧縮の処理に要する時間が大きくなります。 ファイルの内容や圧縮の効率によっては、約150-1000 バイトを下回るファイルを圧縮しないようにしてください。 小さいファイルを圧縮すると、圧縮されていないファイルよりも大きな圧縮ファイルが生成される可能性があります。

クライアントは、圧縮されたコンテンツを処理できる場合、 Accept-Encoding 要求と共にヘッダーを送信することによって、その機能をサーバーに通知する必要があります。 サーバーは、圧縮されたコンテンツを送信するときに、 Content-Encoding 圧縮された応答のエンコード方法に関する情報をヘッダーに含める必要があります。 次の表に、ミドルウェアでサポートされているコンテンツエンコードの表記を示します。

Accept-Encoding ヘッダー値 サポートされているミドルウェア 説明
br あり (既定) Brotli 圧縮データ形式
deflate No 圧縮データ形式の DEFLATE
exi No W3C の効率的な XML インターチェンジ
gzip はい Gzip ファイル形式
identity はい "エンコードなし" 識別子: 応答をエンコードすることはできません。
pack200-gzip No Java アーカイブのネットワーク転送形式
* はい 明示的に要求されていない使用可能なコンテンツ エンコード

詳細については、「IANA Official Content Coding List 」 を参照してください

ミドルウェアを使用すると、カスタム ヘッダー値の圧縮プロバイダーを Accept-Encoding 追加できます。 詳細については、以下の「 カスタム プロバイダー」を参照 してください。

ミドルウェアは、圧縮スキームに優先順位を付けるクライアントによって送信された場合に、品質値 (qvalue、) の重み付け q に対応できます。 詳細については 、「RFC 7231: Accept-Encoding 」を参照してください

圧縮アルゴリズムは、圧縮速度と圧縮の有効性のトレードオフの対象になります。 この コンテキストでの有効性は、圧縮後の出力のサイズを指します。 最小サイズは、最適な圧縮によって 実現 されます。

圧縮されたコンテンツの要求、送信、キャッシュ、および受信に関連するヘッダーを次の表に示します。

ヘッダー Role
Accept-Encoding クライアントからサーバーに送信され、クライアントが受け入れ可能なコンテンツ エンコード スキームを示します。
Content-Encoding ペイロード内のコンテンツのエンコードを示すためにサーバーからクライアントに送信されます。
Content-Length 圧縮が発生すると、応答が圧縮されると本文の内容が変わるので、ヘッダー Content-Length は削除されます。
Content-MD5 圧縮が発生すると、本文の内容が変更され、ハッシュが無効になったので、ヘッダー Content-MD5 は削除されます。
Content-Type コンテンツの MIME の種類を指定します。 すべての応答で、 を指定する必要があります Content-Type 。 ミドルウェアはこの値をチェックして、応答を圧縮する必要があるかどうかを判断します。 ミドルウェアは、エンコードできる既定の MIME の種類のセットを指定しますが、MIME の種類を置き換えるか追加することができます。
Vary クライアントとプロキシに 値を指定してサーバーから送信された場合、ヘッダーは、要求のヘッダーの値に基づいて応答をキャッシュ Accept-Encoding Vary (変更) する必要があるというメッセージをクライアントまたはプロキシに示します。 Accept-Encoding ヘッダーを使用してコンテンツを返した結果、圧縮された応答と圧縮されていない応答の両方 Vary: Accept-Encoding が個別にキャッシュされます。

サンプルアプリを使用して、応答圧縮ミドルウェアの機能を検証します。 このサンプルでは、次のことを示します。

  • Gzip およびカスタム圧縮プロバイダーを使用したアプリ応答の圧縮。
  • 圧縮する mime の種類の既定の一覧に MIME の種類を追加する方法について説明します。

Package

ミドルウェアをプロジェクトに含めるには、 Microsoft.AspNetCore.App メタパッケージへの参照を追加します。これには、 AspNetCore パッケージが含まれています。

構成

次のコードは、既定の MIME の種類と圧縮プロバイダー (BrotliGzip) に対して応答圧縮ミドルウェアを有効にする方法を示しています。

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddResponseCompression();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseResponseCompression();
    }
}

メモ:

  • app.UseResponseCompression 応答を圧縮するミドルウェアの前にを呼び出す必要があります。 詳細については、「ASP.NET Core のミドルウェア」を参照してください。
  • FiddlerFirefox Browser DeveloperPostmanなどのツールを使用して Accept-Encoding 要求ヘッダーを設定し、応答ヘッダー、サイズ、および本文を調査します。

ヘッダーを使用せずにサンプルアプリに要求を送信 Accept-Encoding し、応答が圧縮されていないことを確認します。 Content-Encoding Vary 応答にヘッダーとヘッダーが存在しません。

Accept-Encoding ヘッダーのない要求の結果を示す Fiddler ウィンドウ。 応答が圧縮されていません。

ヘッダー (Brotli compression) を使用してサンプルアプリに要求を送信 Accept-Encoding: br し、応答が圧縮されていることを確認します。 Content-Encoding Vary 応答には、ヘッダーとヘッダーが存在します。

Accept-Encoding ヘッダーと br の値を含む要求の結果を示す Fiddler ウィンドウ。 Vary ヘッダーと Content-type ヘッダーが応答に追加されます。 応答は圧縮されます。

プロバイダー

Brotli 圧縮プロバイダー

BrotliCompressionProvider Brotli 圧縮データ形式で応答を圧縮するには、を使用します。

圧縮プロバイダーがに明示的に追加されていない場合は、次のように CompressionProviderCollection なります。

  • Brotli 圧縮プロバイダーは、Gzip 圧縮プロバイダー と共に、圧縮プロバイダーの配列に既定 で追加されます
  • Brotli 圧縮データ形式がクライアントでサポートされている場合、圧縮は既定で Brotli 圧縮になります。 Brotli がクライアントでサポートされていない場合、クライアントで Gzip 圧縮がサポートされている場合、圧縮は既定で Gzip になります。
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();
}

Brotli 圧縮プロバイダーは、圧縮プロバイダーが明示的に追加されている場合に追加する必要があります。

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}

を使用して圧縮レベルを設定します BrotliCompressionProviderOptions 。 Brotli 圧縮プロバイダーの既定値は、最も高速な圧縮レベル (CompressionLevel.Fastest) です。この場合、最も効率的な圧縮が生成されない可能性があります。 最も効率的な圧縮が必要な場合は、最適な圧縮用にミドルウェアを構成します。

Compression Level 説明
CompressionLevel.Fastest 結果の出力が最適に圧縮されていない場合でも、圧縮は可能な限り迅速に完了する必要があります。
CompressionLevel.NoCompression 圧縮を実行する必要はありません。
CompressionLevel.Optimal 圧縮の完了に時間がかかる場合でも、応答を最適に圧縮する必要があります。
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();

    services.Configure<BrotliCompressionProviderOptions>(options => 
    {
        options.Level = CompressionLevel.Fastest;
    });
}

Gzip 圧縮プロバイダー

を使用 GzipCompressionProvider して、Gzip ファイル形式で 応答を圧縮します

圧縮プロバイダーが に明示的に追加されていない場合 CompressionProviderCollection :

  • Gzip 圧縮プロバイダーは、Brotli 圧縮プロバイダー と共に、圧縮プロバイダーの配列に 既定で追加されます
  • Brotli 圧縮データ形式がクライアントでサポートされている場合、圧縮は既定で Brotli 圧縮になります。 Brotli がクライアントでサポートされていない場合、クライアントで Gzip 圧縮がサポートされている場合、圧縮は既定で Gzip になります。
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();
}

圧縮プロバイダーが明示的に追加される場合は、Gzip 圧縮プロバイダーを追加する必要があります。

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}

圧縮レベルをに設定 GzipCompressionProviderOptions します。 Gzip 圧縮プロバイダーは、既定で最も高速な圧縮レベル (CompressionLevel) に設定されています。これにより、圧縮率が最も高くなる可能性があります。 最も効率的な圧縮が必要な場合は、最適な圧縮のためにミドルウェアを構成します。

Compression Level 説明
CompressionLevel 圧縮は、結果の出力が最適に圧縮されない場合でも、できるだけ早く完了する必要があります。
CompressionLevel 圧縮は実行されません。
CompressionLevel 圧縮が完了するまでに時間がかかる場合でも、応答は最適に圧縮される必要があります。
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();

    services.Configure<GzipCompressionProviderOptions>(options => 
    {
        options.Level = CompressionLevel.Fastest;
    });
}

カスタム プロバイダー

を使用して、カスタム圧縮実装を作成 ICompressionProvider します。 は、 EncodingName このによって生成されるコンテンツエンコーディングを表し ICompressionProvider ます。 ミドルウェアは、この情報を使用して、要求のヘッダーに指定されている一覧に基づいてプロバイダーを選択し Accept-Encoding ます。

サンプルアプリを使用して、クライアントはヘッダーを使用して要求を送信し Accept-Encoding: mycustomcompression ます。 ミドルウェアはカスタム圧縮実装を使用して、応答をヘッダーと共に返し Content-Encoding: mycustomcompression ます。 カスタム圧縮実装を機能させるには、クライアントがカスタムエンコードを圧縮解除できる必要があります。

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}
public class CustomCompressionProvider : ICompressionProvider
{
    public string EncodingName => "mycustomcompression";
    public bool SupportsFlush => true;

    public Stream CreateStream(Stream outputStream)
    {
        // Create a custom compression stream wrapper here
        return outputStream;
    }
}

ヘッダーを使用してサンプルアプリに要求を送信し、応答ヘッダーを確認し Accept-Encoding: mycustomcompression ます。 Vary Content-Encoding 応答には、ヘッダーとヘッダーが存在します。 このサンプルでは、応答本文 (表示されません) は圧縮されません。 サンプルのクラスには圧縮実装がありません CustomCompressionProvider 。 ただし、このサンプルでは、このような圧縮アルゴリズムを実装する場所を示しています。

要求の結果を示す Fiddler ウィンドウには、ヘッダーAccept-Encoding mycustomcompression の値が表示されます。 Vary ヘッダーと Content-Encoding ヘッダーが応答に追加されます。

MIME タイプ

ミドルウェアは、圧縮のために既定の MIME の種類のセットを指定します。

  • application/javascript
  • application/json
  • application/xml
  • text/css
  • text/html
  • text/json
  • text/plain
  • text/xml

MIME の種類を応答圧縮ミドルウェア オプションに置き換えるか追加します。 ワイルドカード MIME の種類 ( など text/* ) はサポートされていません。 サンプル アプリは、 の MIME の種類を追加して圧縮し、ASP.NET Core バナー イメージ image/svg+xml (banner.svg ) を提供します

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}

セキュリティで保護されたプロトコルを使用した圧縮

セキュリティで保護された接続に対する圧縮された応答は、 オプションを使用して制御できます。 EnableForHttps このオプションは既定で無効になっています。 動的に生成されたページで圧縮を使用すると 、CRIME や BREACH 攻撃などのセキュリティの問題 が発生 する可能性があります。

Vary ヘッダーの追加

ヘッダーに基づいて応答を圧縮する場合、応答の圧縮されたバージョンと圧縮されていないバージョンが複数存在する Accept-Encoding 可能性があります。 クライアントとプロキシのキャッシュに複数のバージョンが存在し、格納する必要があるよう指示するために、ヘッダーに値 Vary が追加 Accept-Encoding されます。 Core 2.0 ASP.NET 以降では、応答が圧縮された場合、ミドルウェアによってヘッダー Vary が自動的に追加されます。

Nginx リバース プロキシの背後にある場合のミドルウェアの問題

要求が Nginx によってプロキシされると、ヘッダー Accept-Encoding は削除されます。 ヘッダーを削除 Accept-Encoding すると、ミドルウェアで応答が圧縮されません。 詳細については 、「NGINX: 圧縮と圧縮解除」を参照してください。 この問題は 、Nginx のパススルー圧縮 (aspnet/BasicMiddleware #123) によって追跡されます

IIS 動的圧縮の操作

アクティブな IIS 動的圧縮モジュールが、アプリに対して無効にするサーバー レベルで構成されている場合は、web.configファイルに追加してモジュール を無効 にします。 詳細については、「Disabling IIS modules」 (IIS モジュールの無効化) を参照してください。

トラブルシューティング

FiddlerFirefox Browser DeveloperPostmanなどのツールを使用すると、要求ヘッダーを設定 Accept-Encoding し、応答ヘッダー、サイズ、本文を調べることができます。 既定では、応答圧縮ミドルウェアは、次の条件を満たす応答を圧縮します。

  • Accept-Encodingヘッダーには br 、設定した gzip * カスタム圧縮プロバイダーに一致する値、、、またはカスタムエンコーディングが含まれています。 値は、 identity または品質値 (qvalue, q ) の 0 (ゼロ) に設定することはできません。
  • MIME の種類 ( Content-Type ) を設定し、で構成されている mime の種類と一致させる必要があり ResponseCompressionOptions ます。
  • 要求にヘッダーを含めることはできません Content-Range
  • 応答圧縮ミドルウェアのオプションで secure protocol (https) が構成されている場合を除き、要求では安全でないプロトコル (http) を使用する必要があります。 セキュリティで保護されたコンテンツの圧縮を有効にする場合は、 前述 の危険に注意してください。

その他の技術情報

ネットワーク帯域幅はリソースが限られています。 通常、応答のサイズを小さくすると、アプリの応答性が大幅に向上します。 ペイロードサイズを減らす方法の1つは、アプリの応答を圧縮することです。

サンプル コードを表示またはダウンロードします (ダウンロード方法)。

応答圧縮ミドルウェアを使用する場合

IIS、Apache、または Nginx のサーバーベースの応答圧縮テクノロジを使用します。 ミドルウェアのパフォーマンスがサーバーモジュールのパフォーマンスと一致しない場合があります。 HTTP.sys サーバーKestrel サーバーでは、現在、組み込みの圧縮サポートは提供されていません。

次の場合に応答圧縮ミドルウェアを使用します。

応答圧縮

通常、ネイティブに圧縮されていない応答は、応答の圧縮の恩恵を受ける可能性があります。 ネイティブに圧縮されない応答には、通常、CSS、JavaScript、HTML、XML、JSON が含まれます。 PNG ファイルなどのネイティブ圧縮アセットを圧縮してはならない。 ネイティブに圧縮された応答をさらに圧縮しようとすると、サイズと転送時間の小さな減少は、圧縮の処理にかかった時間によって大きく変わる可能性があります。 約 150 から 1000 バイト未満のファイルは圧縮しない (ファイルの内容と圧縮の効率に応じて)。 小さいファイルを圧縮するオーバーヘッドにより、圧縮されていないファイルよりも大きい圧縮ファイルが生成される可能性があります。

クライアントが圧縮されたコンテンツを処理できる場合、クライアントはヘッダーを要求と一緒に送信することで、その機能をサーバー Accept-Encoding に通知する必要があります。 サーバーは、圧縮されたコンテンツを送信するときに、圧縮された応答のエンコード方法に関する情報を ヘッダー Content-Encoding に含める必要があります。 ミドルウェアでサポートされているコンテンツ エンコードの指定を次の表に示します。

Accept-Encoding ヘッダー値 サポートされているミドルウェア 説明
br いいえ Brotli 圧縮データ形式
deflate No DEFLATE 圧縮データ形式
exi No W3C の効率的な XML インターチェンジ
gzip あり (既定) Gzip ファイル形式
identity はい "エンコードなし" 識別子: 応答をエンコードすることはできません。
pack200-gzip No Java アーカイブのネットワーク転送形式
* はい 明示的に要求されていない利用可能なコンテンツエンコーディング

詳細については、「 IANA 公式コンテンツコーディングリスト」を参照してください。

ミドルウェアを使用すると、カスタムヘッダー値の圧縮プロバイダーを追加でき Accept-Encoding ます。 詳細については、以下の「 カスタムプロバイダー 」を参照してください。

ミドルウェアは、 q 圧縮スキームの優先順位を決定するためにクライアントから送信されるときに、品質の値 (qvalue,) の重み付けに対応できます。 詳細については、「 RFC 7231: Accept-Encoding」を参照してください。

圧縮アルゴリズムは、圧縮速度と圧縮の効果のトレードオフの影響を受けます。 このコンテキストの 効果 は、圧縮後の出力のサイズを示します。 最小サイズは 最適 な圧縮によって実現されます。

次の表では、圧縮されたコンテンツの要求、送信、キャッシュ、および受信に関連するヘッダーについて説明します。

ヘッダー Role
Accept-Encoding クライアントからサーバーに送信され、クライアントが使用できるコンテンツエンコーディングスキームを示します。
Content-Encoding ペイロード内のコンテンツのエンコードを示すために、サーバーからクライアントに送信されます。
Content-Length 圧縮が発生すると、 Content-Length 応答が圧縮されるときに本文の内容が変更されるため、ヘッダーは削除されます。
Content-MD5 圧縮が行われると、 Content-MD5 本文の内容が変更され、ハッシュが有効でなくなったため、ヘッダーは削除されます。
Content-Type コンテンツの MIME の種類を指定します。 すべての応答で、を指定する必要があり Content-Type ます。 ミドルウェアはこの値をチェックして、応答を圧縮する必要があるかどうかを判断します。 ミドルウェアは、エンコードできる既定の MIME の種類のセットを指定しますが、MIME の種類を置き換えるか追加することができます。
Vary クライアントとプロキシに 値を指定してサーバーから送信された場合、ヘッダーは、要求のヘッダーの値に基づいて応答をキャッシュ Accept-Encoding Vary (変更) する必要があるというメッセージをクライアントまたはプロキシに示します。 Accept-Encoding ヘッダーを使用してコンテンツを返した結果、圧縮された応答と圧縮されていない応答の両方 Vary: Accept-Encoding が個別にキャッシュされます。

サンプル アプリ を使用して、応答圧縮ミドルウェアの機能 を確認します。 サンプルは次の例を示しています。

  • Gzip とカスタム圧縮プロバイダーを使用したアプリ応答の圧縮。
  • 圧縮のために MIME の種類の既定の一覧に MIME の種類を追加する方法。

Package

ミドルウェアをプロジェクトに含めるには、microsoft.AspNetCore.ResponseCompressionパッケージを含むMicrosoft.AspNetCore.Appメタパッケージ への参照を追加します。

構成

次のコードは、既定の MIME の種類と Gzip 圧縮プロバイダーに対して応答圧縮ミドルウェアを有効 にする方法を示しています

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddResponseCompression();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseResponseCompression();
    }
}

メモ:

  • app.UseResponseCompression は、応答を圧縮するミドルウェアの前に呼び出す必要があります。 詳細については、「ASP.NET Core のミドルウェア」を参照してください。
  • Fiddler、FirefoxBrowser Developer、Postmanなどのツールを使用して、要求ヘッダーを設定し、応答ヘッダー、サイズ、本文 Accept-Encoding を調査します。

ヘッダーなしでサンプル アプリに要求を送信し、応答が圧縮 Accept-Encoding されていないのを確認します。 ヘッダー Content-Encoding Vary と ヘッダーは応答に存在しません。

要求の結果を示す Fiddler ウィンドウ。ヘッダーがAccept-Encodingされます。 応答は圧縮されません。

ヘッダーを使用してサンプル アプリに要求を Accept-Encoding: gzip 送信し、応答が圧縮されているのを確認します。 ヘッダー Content-EncodingVary ヘッダーが応答に存在します。

要求の結果を示す Fiddler ウィンドウには、Accept-Encodingヘッダーと gzip の値が表示されます。 Vary ヘッダーと Content-Encoding ヘッダーが応答に追加されます。 応答は圧縮されます。

プロバイダー

Gzip 圧縮プロバイダー

を使用して、 GzipCompressionProvider Gzip ファイル形式で応答を圧縮します。

圧縮プロバイダーがに明示的に追加されていない場合は、次のように CompressionProviderCollection なります。

  • Gzip 圧縮プロバイダーは、既定で圧縮プロバイダーの配列に追加されます。
  • クライアントで Gzip 圧縮がサポートされている場合、圧縮の既定値は Gzip です。
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();
}

圧縮プロバイダーが明示的に追加されている場合は、Gzip 圧縮プロバイダーを追加する必要があります。

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}

圧縮レベルをに設定 GzipCompressionProviderOptions します。 Gzip 圧縮プロバイダーは、既定で最も高速な圧縮レベル (CompressionLevel) に設定されています。これにより、圧縮率が最も高くなる可能性があります。 最も効率的な圧縮が必要な場合は、最適な圧縮のためにミドルウェアを構成します。

Compression Level 説明
CompressionLevel 圧縮は、結果の出力が最適に圧縮されない場合でも、できるだけ早く完了する必要があります。
CompressionLevel 圧縮は実行されません。
CompressionLevel 圧縮が完了するまでに時間がかかる場合でも、応答は最適に圧縮される必要があります。
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();

    services.Configure<GzipCompressionProviderOptions>(options => 
    {
        options.Level = CompressionLevel.Fastest;
    });
}

カスタム プロバイダー

を使用して、カスタム圧縮実装を作成 ICompressionProvider します。 は、 EncodingName このによって生成されるコンテンツエンコーディングを表し ICompressionProvider ます。 ミドルウェアは、この情報を使用して、要求のヘッダーに指定されている一覧に基づいてプロバイダーを選択し Accept-Encoding ます。

サンプルアプリを使用して、クライアントはヘッダーを使用して要求を送信し Accept-Encoding: mycustomcompression ます。 ミドルウェアは、カスタム圧縮実装を使用し、 ヘッダーを含む応答を返 Content-Encoding: mycustomcompression します。 カスタム圧縮の実装を機能するには、クライアントがカスタム エンコードを圧縮解除できる必要があります。

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}
public class CustomCompressionProvider : ICompressionProvider
{
    public string EncodingName => "mycustomcompression";
    public bool SupportsFlush => true;

    public Stream CreateStream(Stream outputStream)
    {
        // Create a custom compression stream wrapper here
        return outputStream;
    }
}

ヘッダーを使用してサンプル アプリに要求を Accept-Encoding: mycustomcompression 送信し、応答ヘッダーを確認します。 ヘッダー VaryContent-Encoding ヘッダーが応答に存在します。 応答本文 (表示されません) は、サンプルによって圧縮されません。 サンプルの クラスに圧縮 CustomCompressionProvider の実装は含め"ない。 ただし、このサンプルでは、このような圧縮アルゴリズムを実装する場所を示しています。

要求の結果を示す Fiddler ウィンドウには、ヘッダーAccept-Encoding mycustomcompression の値が表示されます。 Vary ヘッダーと Content-Encoding ヘッダーが応答に追加されます。

MIME タイプ

ミドルウェアは、圧縮のために既定の MIME の種類のセットを指定します。

  • application/javascript
  • application/json
  • application/xml
  • text/css
  • text/html
  • text/json
  • text/plain
  • text/xml

MIME の種類を応答圧縮ミドルウェア オプションに置き換えるか追加します。 ワイルドカード MIME の種類 ( など text/* ) はサポートされていません。 サンプル アプリは、 の MIME の種類を追加して圧縮し、ASP.NET Core バナー イメージ image/svg+xml (banner.svg ) を提供します

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}

セキュリティで保護されたプロトコルを使用した圧縮

セキュリティで保護された接続に対する圧縮された応答は、 オプションを使用して制御できます。 EnableForHttps このオプションは既定で無効になっています。 動的に生成されたページで圧縮を使用すると 、CRIME や BREACH 攻撃などのセキュリティの問題 が発生 する可能性があります。

Vary ヘッダーの追加

ヘッダーに基づいて応答を圧縮する場合、応答の圧縮されたバージョンと圧縮されていないバージョンが複数存在する Accept-Encoding 可能性があります。 クライアントとプロキシのキャッシュに複数のバージョンが存在し、格納する必要があるよう指示するために、ヘッダーに値 Vary が追加 Accept-Encoding されます。 Core 2.0 ASP.NET 以降では、応答が圧縮された場合、ミドルウェアによってヘッダー Vary が自動的に追加されます。

Nginx リバースプロキシの背後にあるミドルウェアの問題

要求が Nginx によってプロキシされている場合、 Accept-Encoding ヘッダーは削除されます。 ヘッダーを削除すると、 Accept-Encoding ミドルウェアが応答を圧縮できなくなります。 詳細については、「 NGINX: Compression And 伸張」を参照してください。 この問題は、 Nginx (aspnet/BasicMiddleware #123) のパススルー圧縮によって追跡されます。

IIS 動的圧縮の使用

アプリケーションに対して無効にする、アクティブな IIS 動的圧縮モジュールがサーバーレベルで構成されている場合は、 web.config ファイルを追加してモジュールを無効にします。 詳細については、「Disabling IIS modules」 (IIS モジュールの無効化) を参照してください。

トラブルシューティング

FiddlerFirefox Browser DeveloperPostmanなどのツールを使用すると、要求ヘッダーを設定 Accept-Encoding し、応答ヘッダー、サイズ、本文を調べることができます。 既定では、応答圧縮ミドルウェアは、次の条件を満たす応答を圧縮します。

  • Accept-Encodingヘッダーには gzip 、設定した * カスタム圧縮プロバイダーに一致する値、、またはカスタムエンコーディングが含まれています。 値は、 identity または品質値 (qvalue, q ) の 0 (ゼロ) に設定することはできません。
  • MIME の種類 ( Content-Type ) を設定し、で構成されている mime の種類と一致させる必要があり ResponseCompressionOptions ます。
  • 要求にヘッダーを含めることはできません Content-Range
  • 応答圧縮ミドルウェアのオプションで secure protocol (https) が構成されている場合を除き、要求では安全でないプロトコル (http) を使用する必要があります。 セキュリティで保護されたコンテンツの圧縮を有効にする場合は、 前述 の危険に注意してください。

その他の技術情報