Почему app.UseResponseCompression () увеличивает размер ответа, передаваемого по сети? - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь включить сжатие ответа, используя очень простое приложение 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 КБ.

Теперь посмотрим, что говорит Chrome:

enter image description here

Odd. So let's see in Fiddler. The first request is "normal", the second one is with the header Accept-Encoding: br

введите описание изображения здесь

Я также пробовал сжатие Gzip, практически с тем же результатом.

Это в значительной степени противоположное тому, что я ожидал. Такой текстовый файл должен быть невероятно сжимаемым даже в самой «быстрой» конфигурации. Я ожидаю, что по сети будет передано менее 1 КБ.

Что я делаю не так? Заранее спасибо.

1 Ответ

1 голос
/ 14 июля 2020
Промежуточное ПО

app.UseResponseCompression(); работает только для Content-Type, которое представляет типы MIME в HttpResponse вместо записи потока файлов в HttpResponse, как вы делаете.

в документации вы увидите эту строку:

Content-Type : указывает MIME-тип содержимого. Каждый ответ должен указывать свой Content-Type. По промежуточного слоя проверяет это значение, чтобы определить, следует ли сжать ответ. Промежуточное ПО определяет набор типов MIME по умолчанию, которые оно может кодировать, но вы можете заменять или добавлять типы MIME.

Если вы хотите сжать пользовательский файл, вам необходимо записать файловый поток с заголовком Content-Type. Позже, когда этот ответ вернется к промежуточному программному обеспечению 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...