.net核心中的GZIP无法正常工作

时间:2017-01-19 01:25:52

标签: c# asp.net asp.net-core .net-core

我正在尝试将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中的响应标头如下所示:

enter image description here

我在视觉工作室开发的Windows机器上。运行应用程序时,我尝试从Visual Studio(通过F5)运行,并从命令行使用“dotnet run”命令。既没有输出GZip压缩。

7 个答案:

答案 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)

这是我的解决方案:

  1. 确保您的 Fiddler 的“解码”功能已禁用。您可以在响应中看到一个黄色条。 Disable Decode

  2. 或者退出 Fillder 或其他代理应用程序并尝试一下。