为什么 app.UseResponseCompression() 会增加通过网络传输的响应的大小?
Why is app.UseResponseCompression() increasing the size of the response transferred over network?
我正在尝试使用一个非常简单的 Asp.Net Core 3.1 应用程序启用响应压缩。我当前的代码:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<BrotliCompressionProviderOptions>(options => options.Level = CompressionLevel.Optimal);
services.AddResponseCompression(options =>
{
options.Providers.Add<BrotliCompressionProvider>();
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseResponseCompression();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/", async context =>
{
var text = File.ReadAllText(@"D:\huge-response.txt");
await context.Response.WriteAsync(text);
});
});
}
在 huge-response.txt 文件中,我有这个:
qwer qwert qwert qwert qwert
qwer qwert qwert qwert qwert
qwer qwert qwert qwert qwert
qwer qwert qwert qwert qwert
qwer qwert qwert qwert qwert
qwer qwert qwert qwert qwert
....
重复了很多次。文件大小为 626 KB。
现在,让我们看看 Chrome 是怎么说的:
奇怪。那么让我们在Fiddler中看看。第一个请求是“正常”,第二个请求是 header Accept-Encoding: br
我也试过Gzip压缩,结果基本一样
这与我想的完全相反。这样的文本文件应该是可压缩的,即使是在“最快”的配置下。我希望看到通过网络传输的数据少于 1 KB。
我做错了什么?提前致谢。
app.UseResponseCompression();
中间件仅适用于 Content-Type
,它在 HttpResponse
中显示 MIME Types,而不是像您正在做的那样将文件流写入 HttpResponse
。
按照文档,您将看到这一行:
Content-Type:指定内容的MIME类型。每个响应都应指定其内容类型。中间件检查此值以确定是否应压缩响应。中间件指定一组它可以编码的默认 MIME 类型,但您可以替换或添加 MIME 类型。
如果你想压缩自定义文件,你需要写带有Content-Type
header 的文件流。然后稍后当这个响应返回到 ResponseCompression
中间件时,它将被压缩。
public async Task Invoke(HttpContext context)
{
context.Response.ContentType = "text/plain";
using (var fs = new FileStream(@"D:\huge-response.txt", FileMode.Open))
{
await fs.CopyToAsync(context.Response.Body);
}
}
我正在尝试使用一个非常简单的 Asp.Net Core 3.1 应用程序启用响应压缩。我当前的代码:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<BrotliCompressionProviderOptions>(options => options.Level = CompressionLevel.Optimal);
services.AddResponseCompression(options =>
{
options.Providers.Add<BrotliCompressionProvider>();
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseResponseCompression();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/", async context =>
{
var text = File.ReadAllText(@"D:\huge-response.txt");
await context.Response.WriteAsync(text);
});
});
}
在 huge-response.txt 文件中,我有这个:
qwer qwert qwert qwert qwert
qwer qwert qwert qwert qwert
qwer qwert qwert qwert qwert
qwer qwert qwert qwert qwert
qwer qwert qwert qwert qwert
qwer qwert qwert qwert qwert
....
重复了很多次。文件大小为 626 KB。
现在,让我们看看 Chrome 是怎么说的:
奇怪。那么让我们在Fiddler中看看。第一个请求是“正常”,第二个请求是 header Accept-Encoding: br
我也试过Gzip压缩,结果基本一样
这与我想的完全相反。这样的文本文件应该是可压缩的,即使是在“最快”的配置下。我希望看到通过网络传输的数据少于 1 KB。
我做错了什么?提前致谢。
app.UseResponseCompression();
中间件仅适用于 Content-Type
,它在 HttpResponse
中显示 MIME Types,而不是像您正在做的那样将文件流写入 HttpResponse
。
按照文档,您将看到这一行:
Content-Type:指定内容的MIME类型。每个响应都应指定其内容类型。中间件检查此值以确定是否应压缩响应。中间件指定一组它可以编码的默认 MIME 类型,但您可以替换或添加 MIME 类型。
如果你想压缩自定义文件,你需要写带有Content-Type
header 的文件流。然后稍后当这个响应返回到 ResponseCompression
中间件时,它将被压缩。
public async Task Invoke(HttpContext context)
{
context.Response.ContentType = "text/plain";
using (var fs = new FileStream(@"D:\huge-response.txt", FileMode.Open))
{
await fs.CopyToAsync(context.Response.Body);
}
}