web-dev-qa-db-ja.com

.netコアのGZIPが機能しない

ASP.netコアアプリにGzipミドルウェアを追加しようとしています。

次のパッケージを追加しました。

"Microsoft.AspNetCore.ResponseCompression": "1.0.0"

サービスの設定方法の私のstartup.csで、私は以下を持っています:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<GzipCompressionProviderOptions>(options => options.Level = CompressionLevel.Fastest);
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<GzipCompressionProvider>();
    });

    services.AddMvc();
}

私の構成メソッドでは、次のようにしています:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    app.UseResponseCompression();
    app.UseMvc();
}

しかし、ページをロードしようとすると、Gzip圧縮されていないため、ページが読み込まれません。文字列応答とビューの出力の両方を使用しました。 chromeの応答ヘッダーは次のようになります。

enter image description here

私はビジュアルスタジオで開発しているWindowsマシンを使用しています。アプリを実行するときに、Visual Studio(F5経由)から実行し、コマンドラインから「dotnet run」コマンドを使用してみました。どちらもGZip圧縮を出力しません。

19
MindingData

.net core 2. *でGZIPを有効にするには
1。Microsoft.AspNetCore.ResponseCompressionInstall-Package Microsoft.AspNetCore.ResponseCompressionコマンドまたはnugetパッケージマネージャでインストールします。
2。Startup.csに次のコードを追加します

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{

  app.UseResponseCompression();
  app.UseMvc();

}

public void ConfigureServices(IServiceCollection services)
{

  // Configure Compression level
  services.Configure<GzipCompressionProviderOptions>(options => options.Level = CompressionLevel.Fastest);

  // Add Response compression services
  services.AddResponseCompression(options =>
  {
      options.Providers.Add<GzipCompressionProvider>();
      options.EnableForHttps = true;
  });

}
18
Mohammad Dayyan

以下に示すように、応答圧縮オプションプロパティ「EnableForHttps」を追加することで、この問題を解決しました。

services.AddResponseCompression(opt =>
        {
            opt.Providers.Add<GzipCompressionProvider>();
            opt.EnableForHttps = true;
        });
 services.Configure<GzipCompressionProviderOptions>(options => options.Level = 
 CompressionLevel.Fastest);
5
ashwathi

IIS Expressを使用して削除すると、応答圧縮ミドルウェアを有効にできました

<httpCompression ...> 
...
</httpCompression> 

.vs\config\applicationhost.config

2
greentrees

Mohammad Dayyanのanswear は、HTML本文の圧縮に最適です。 CSSやJSなどの静的クライアントファイルも圧縮する場合、_Startup.Configure_メソッドは次のようにする必要があります。

_app.UseResponseCompression();
app.UseStaticFiles();
_

app.UseResponseCompression()beforeapp.UseStaticFiles()を配置することが重要です。それ以外の場合、静的ファイルハンドラーは、圧縮を適用せずにリソースをクライアントに送信します。

AddResponseCompressionで圧縮するMIMEタイプのブラックリストまたはホワイトリストを追加することもできます。

_services.Configure<GzipCompressionProviderOptions>(options => options.Level = CompressionLevel.Fastest);
services.AddResponseCompression(options => {
    options.MimeTypes = new string[]{
        "text/html",
        "text/css",
        "application/javascript",
        "text/javascript"
        // ...
    };

    options.Providers.Add<GzipCompressionProvider>();
});
_

_options.ExcludedMimeTypes_プロパティにより、特定のMIMEタイプを除外することもできます。

はい、そのようなものをアプリケーションサーバーから分離し、圧縮などのためにいくつかのリバースプロキシを使用するための良い議論があります。これにより、ASP.NET Core 2.1 LTSで より効果的なBrotliアルゴリズム を使用できるようになります。これは、正式には新しい2.2リリースでのみ利用できます(サードパーティライブラリに依存するカスタムミドルウェアを除く)。

これも私の最初のアイデアでしたが、nginx 1.17.3は現在gzipとASP.NET Core 2.1でうまく機能していないようです。 gzipを有効にした後、ランダムに_FormatException: Invalid ETag name_例外が発生します。ですから、.NET Coreにこの仕事を任せるのは、私にとっては適切な回避策のようです。

2
Lion

UseResponseCompressionを2回重ねて配置することで、何とか機能させることができました。これがどのように機能したのかはわかりません。私はまだ受け入れられる解決策を探しています。

0
Alexander

置くことで解決

app.UseResponseCompression();

app.UseMvc();

startup.Configure、すなわち:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseHsts();
        }

        app.UseResponseCompression(); // <--
        app.UseHttpsRedirection();
        app.UseMvc(); // <--
    }
0
Baltzar Mattson