我无法让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"在请求中。
但是,服务器没有对响应进行gzip编码:
我做错了什么?
我找到this讨论,并从那里尝试了所有内容,但它没有帮助。
答案 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看到它:
答案 2 :(得分:0)
以下示例演示了中间件的排序位置 静态文件的请求由静态文件中间件处理 在响应压缩中间件之前。静态文件不是 用这种中间件排序压缩。
在Fiddler的屏幕截图下方显示请求和响应以及相应的标题:
答案 3 :(得分:0)
我面临着同样的问题。
我的观察是,如果Fiddler是通过ASP.net核心中间件完成的,则它不显示Content-Encoding。我不确定为什么。
但是,如果我在Chrome调试器中看到了相同的请求,则能够看到包含压缩数据的信息。
答案 4 :(得分:0)