Отправка сжатого файла (gzip), хотя HTTP путается с кодировкой - PullRequest
0 голосов
/ 17 октября 2018

У меня есть сжатый файл.Как отправить его в браузер и заставить его декодировать?

ASP.NET Core поддерживает сжатие следующим образом:

services.AddResponseCompression();
...
app.UseResponseCompresssion
app.Run(async (context) =>
{
    var file = System.IO.File.ReadAllText("file.txt");
    await context.Response.WriteAsync(file);
});

Но мой файл уже сжат.Я попытался просто установить заголовки, прочитать файл и отправить содержимое, но это не соответствует кодировке.

app.Run(async (context) =>
{
    context.Response.Headers.Add("Content-Type", "text/plain");
    context.Response.Headers.Add("Content-Encoding", "gzip");
    context.Response.Headers.Add("Vary", "Accept-Encoding");
    var file = System.IO.File.ReadAllText("compressed.gz");
    await context.Response.WriteAsync(file);
});

Если я просто отправляю файл, Firefox и Chrome пытаются загрузить его, но не распаковываютэто.

Подтверждение этого:

$ cat compressed.gz | hexdump | head -1
0000000 8b1f 0808 3768 5bc6 0302 6966 656c 742e
# that's the magic number: 8b 1f 08

$ curl -X GET   http://localhost:5000/  -H 'Accept-Encoding: gzip'   -H 'Cache-Control: no-cache'  --output - | hexdump | head -1
0000000 ef1f bdbf 0808 3768 bfef 5bbd 0302 6966

Как предотвратить проблемы с кодированием?

1 Ответ

0 голосов
/ 17 октября 2018

Как указал @ t.niese, проблема заключается в чтении текста по строкам.
Правильный способ выполнить эту задачу - вернуть FileStreamResult

Пример:

Response.Headers["Content-Encoding"] = "gzip";
return new FileStreamResult(new FileStream(fileName, FileMode.Open), "text/plain");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...