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の応答ヘッダーは次のようになります。
私はビジュアルスタジオで開発しているWindowsマシンを使用しています。アプリを実行するときに、Visual Studio(F5経由)から実行し、コマンドラインから「dotnet run」コマンドを使用してみました。どちらもGZip圧縮を出力しません。
.net core 2. *でGZIPを有効にするには
1。Microsoft.AspNetCore.ResponseCompression
をInstall-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;
});
}
以下に示すように、応答圧縮オプションプロパティ「EnableForHttps」を追加することで、この問題を解決しました。
services.AddResponseCompression(opt =>
{
opt.Providers.Add<GzipCompressionProvider>();
opt.EnableForHttps = true;
});
services.Configure<GzipCompressionProviderOptions>(options => options.Level =
CompressionLevel.Fastest);
IIS Expressを使用して削除すると、応答圧縮ミドルウェアを有効にできました
<httpCompression ...>
...
</httpCompression>
.vs\config\applicationhost.config
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にこの仕事を任せるのは、私にとっては適切な回避策のようです。
UseResponseCompression
を2回重ねて配置することで、何とか機能させることができました。これがどのように機能したのかはわかりません。私はまだ受け入れられる解決策を探しています。
置くことで解決
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(); // <--
}