首页 > 解决方案 > ASP.NET Core GZIP 编码中间件仅在添加两次后才有效

问题描述

我正在尝试将 GZIP 编码添加到来自 Web 应用程序(.NET Core 2.1)的响应中

我正在关注本指南

根据它,我在 Startup.cs 中添加了以下几行

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

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

        // In production, the React files will be served from this directory
        services.AddSpaStaticFiles(configuration =>
        {
            configuration.RootPath = "ClientApp/build";
        });
    }

 public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {

        app.UseResponseCompression();
        app.UseStaticFiles();
        app.UseSpaStaticFiles();

        // Other middleware 
    }

我正在使用 .NET Core 2.1 附带的默认 WebApplication 模板(使用 React)在全新的 WebApplication 上执行此操作。

但是,当我尝试在我的应用程序上查询控制器操作时,不会应用任何编码。

用 chrome 检查请求/响应是否有以下标头: NoGzip

请求标头包括Accept-Encoding: gzip, deflate, br标头,所以我认为请求不是问题。

现在这是奇怪的部分。一旦我添加了两次app.UseResponseCompression();线,我突然开始得到一些压缩。

app.UseResponseCompression();这是复制两次 后标题的样子:在此处输入图像描述

如您所见,gzip 标头出现了两次。(响应的大小也相当小,因此 gzip 压缩似乎正在工作)

谁能解释发生了什么以及为什么会这样。以这种方式设置项目的主要问题是,稍后在我的管道中我无法解压缩请求,我想这是由于这里发生的一些魔法。

是重现该问题的示例 Web 应用程序。(运行应用程序,打开 localhost:5015 并导航到 Fetch Data。 - 观察浏览器 Web 控制台中发生的情况)

标签: c#asp.net-mvchttpasp.net-coregzip

解决方案


有两个实例

Content-Encoding: gzip

意味着它已被 gzip 两次,因此您需要解压缩两次才能获得预期的效果。


推荐阅读