我正在尝试将Gzip中间件添加到我的ASP.net核心应用程序中。
我添加了以下包:
“Microsoft.AspNetCore.ResponseCompression”:“1.0.0”
在我的startup.cs for Configure Services方法中,我有以下内容:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<GzipCompressionProviderOptions>(options => options.Level = CompressionLevel.Fastest);
services.AddResponseCompression(options =>
{
options.Providers.Add<GzipCompressionProvider>();
});
services.AddMvc();
}
在我的Configure方法中,我有以下内容:
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压缩。
答案 0 :(得分:9)
在.net核心2. *中启用GZIP
1。使用Microsoft.AspNetCore.ResponseCompression
命令或nuget包管理器安装Install-Package Microsoft.AspNetCore.ResponseCompression
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;
});
}
答案 1 :(得分:5)
The answear from Mohammad Dayyan 非常适合压缩HTML正文。如果还要压缩CSS或JS等静态客户端文件,则Startup.Configure
方法必须如下所示:
app.UseResponseCompression();
app.UseStaticFiles();
将app.UseResponseCompression()
放在之前 app.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中使用more effective Brotli algorithm,而正式版本仅在新的2.2版本中可用{{3}}(依赖第三方库的自定义中间件除外)。
这也是我的第一个想法,但似乎nginx 1.17.3当前在gzip和ASP.NET Core 2.1中不能很好地发挥作用。启用gzip后,我会随机得到FormatException: Invalid ETag name
异常。因此,让.NET Core进行此工作对我来说似乎是一个适合的解决方法。
答案 2 :(得分:4)
通过添加响应压缩选项属性“ EnableForHttps”来解决此问题,如下所示:
services.AddResponseCompression(opt =>
{
opt.Providers.Add<GzipCompressionProvider>();
opt.EnableForHttps = true;
});
services.Configure<GzipCompressionProviderOptions>(options => options.Level =
CompressionLevel.Fastest);
答案 3 :(得分:2)
通过删除
,我设法在使用IIS Express时启用了响应压缩中间件<httpCompression ...>
...
</httpCompression>
<。>在.vs \ config \ applicationhost.config 中
答案 4 :(得分:0)
将UseResponseCompression
两次放在彼此之下,我设法让它发挥作用。我不知道这是如何使它工作的。我仍然在寻找一个公认的解决方案。
答案 5 :(得分:0)
通过放置来解决
app.UseResponseCompression();
之前
app.UseMvc();
在启动配置中,即:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
}
app.UseResponseCompression(); // <--
app.UseHttpsRedirection();
app.UseMvc(); // <--
}
答案 6 :(得分:0)
这是我的解决方案:
确保您的 Fiddler 的“解码”功能已禁用。您可以在响应中看到一个黄色条。 Disable Decode
或者退出 Fillder 或其他代理应用程序并尝试一下。