FileStreamResult не распознает несколько диапазонов http в Asp.Net Core 2.2 - PullRequest
1 голос
/ 02 ноября 2019

У меня есть такая простая конечная точка:

[HttpGet]
public IActionResult GetFileDirect()
{
     var path = ...; // path to the file
     return File(System.IO.File.OpenRead(path), "text/plain", true);
}

В настоящее время содержимое файла:

abcdefghijklmnopqrstuvwxyz

Как вы видите в возвращениизаявление, которое я передаю true для enableRangeProcessing. И это работает, как и ожидалось в случае запроса одного диапазона:

curl -H Range:bytes=0-8 http://localhost:65318/api/File -i

Вот ответ:

HTTP/1.1 206 Partial Content
Content-Length: 9
Content-Type: text/plain
Content-Range: bytes 0-8/26
Accept-Ranges: bytes
Server: Kestrel
X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcY2ViaXlcRGVza3RvcFxSYW5nZVdlYlxSYW5nZVdlYlxhcGlcRmlsZQ==?=
X-Powered-By: ASP.NET
Date: Sat, 02 Nov 2019 17:46:49 GMT

abcdefghi

Но, вв случае многодиапазонного запроса, он просто не будет учитывать какой-либо диапазон и вернет Ok ответ с полным содержимым файла:

curl -H  Range:bytes=0-8,12-15 http://localhost:65318/api/File -i

Вот ответ:

HTTP/1.1 200 OK
Content-Length: 26
Content-Type: text/plain
Accept-Ranges: bytes
Server: Kestrel
X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcY2ViaXlcRGVza3RvcFxSYW5nZVdlYlxSYW5nZVdlYlxhcGlcRmlsZQ==?=
X-Powered-By: ASP.NET
Date: Sat, 02 Nov 2019 17:49:37 GMT

abcdefghijklmnopqrstuvwxyz

1 Ответ

2 голосов
/ 03 ноября 2019

Я погрузился в исходный код немного глубже, чем @Nkosi, чтобы найти место, где анализируются диапазоны, посмотрите AspNetCore - RangeHelper.cs

if (rawRangeHeader.Count > 1 || rawRangeHeader[0].IndexOf(',') >= 0)
{
    logger.LogDebug("Multiple ranges are not supported.");

    // The spec allows for multiple ranges but we choose not to support them because the client may request
    // very strange ranges (e.g. each byte separately, overlapping ranges, etc.) that could negatively
    // impact the server. Ignore the header and serve the response normally.               
    return (false, null);
}
...