Gzip压缩中间件无法在asp.net核心2.0中运行

时间:2018-06-13 17:25:28

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

我无法让Gzip压缩中间件在asp.net core 2.0(或2.1)中运行。我使用" Blank"创建了一个新项目。 Web应用程序模板,并在Startup.cs中包含以下代码:

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseResponseCompression();

    app.Run(async (context) =>
        {
            context.Response.Headers.Add("Content-Type", "text/plain");
            await context.Response.WriteAsync("Hello World!");
        });
}

我确认Chrome正在发送"接受编码:gzip,deflate,br"在请求中。

Accept-Encoding

但是,服务器没有对响应进行gzip编码:

Content-Encoding

我做错了什么?

我找到this讨论,并从那里尝试了所有内容,但它没有帮助。

5 个答案:

答案 0 :(得分:1)

TL; DR:代码很好,环境有问题。

首先,请确定您是否有防病毒软件拦截传入的HTTP通信。就我而言,它是ESET Endpoint Antivirus。 其次,检查您的响应中是否存在标题Vary: Accept-Encoding。这表明Kestrel已正确处理您的请求,并注意了Accept-Encoding请求标头。

如果您确实具有防病毒功能,则发生的情况是它会嗅探传入的未加密流量,并会看到gzip标头并解压缩消息以检查是否存在恶意软件或其他内容。然后,它将解压缩后的响应传递给浏览器,并删除gzip内容编码标头。

您应该关闭防病毒软件一段时间,或者在没有任何功能的环境中测试此功能。

答案 1 :(得分:1)

我遇到了类似的问题(在Mac上为asp.net内核)

解决方案是确保将响应压缩称为静态文件投放之前。

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseCookiePolicy();

        // ordering matters here
        app.UseResponseCompression();
        app.UseStaticFiles();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }

正确订购后,可以在br(Brotli压缩)编码下以chrome看到它:

enter image description here

答案 2 :(得分:0)

来自ASP.NET Core Middleware

  

以下示例演示了中间件的排序位置   静态文件的请求由静态文件中间件处理   在响应压缩中间件之前。静态文件不是   用这种中间件排序压缩。

在Fiddler的屏幕截图下方显示请求和响应以及相应的标题:

enter image description here

答案 3 :(得分:0)

我面临着同样的问题。

我的观察是,如果Fiddler是通过ASP.net核心中间件完成的,则它不显示Content-Encoding。我不确定为什么。

但是,如果我在Chrome调试器中看到了相同的请求,则能够看到包含压缩数据的信息。

  1. 图像中的第一行未压缩
  2. 图像中的第二行具有压缩效果

enter image description here

答案 4 :(得分:0)

如果您使用 Fiddler,请确保禁用“解码”功能,否则 Fiddler 将自动解码。 disable decode