Отсутствует заголовок диапазона в AspNetCore

#c# #http #asp.net-core

#c# #http #asp.net-core

Вопрос:

Мне не хватает заголовка диапазона, когда браузер отправляет http-запрос.

Это заголовки, отправленные браузером:

 GET /Shared/Files/DownloadFile/856 HTTP/1.1
Host: localhost:5001
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0
Accept: video/webm,video/ogg,video/*;q=0.9,application/ogg;q=0.7,audio/*;q=0.6,*/*;q=0.5
Accept-Language: da,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate, br
Referer: https://localhost:5001/Basic/Message/Details/611/
Range: bytes=0-
Connection: keep-alive
Cookie: Session=0af9f0f2-3201-43a9-b7af-e9d91390b42a
  

У меня есть собственная реализация IActionResult

 public class PartialContentResult : IActionResult
{
    public PartialContentResult(int id, AzurePrivateStorage azure)
    {
        this.id = id;
        this.azure = azure;
    }

    public Task ExecuteResultAsync(ActionContext context)
    {
        var headers = context.HttpContext.Request.Headers;

        // headers["Range"] always return StringValues.Empty
        var range = headers["Range"].ToString();
        // Why is Range always empty??
            
        var match = Regex.Match(range, @"^bytes=(d*)-(d*)");
        Task resu<
        if (match.Success)
        {
            long? from = GetLongValue(match.Groups[1].Value);
            long? to = GetLongValue(match.Groups[2].Value);
            long? length = from - to;

            result = azure.Download(id, context, from, length, context.HttpContext.RequestAborted);
        }
        else
        {
            result = azure.Download(id, context, context.HttpContext.RequestAborted);
        }
        return resu<
    }

    private long? GetLongValue(string value)
    {
        return string.IsNullOrEmpty(value) ? null : (long?)Convert.ToInt64(value);
    }
}
  

headers["Range"] всегда возвращайте StringValues.EmptyString в ExecuteResultAsync .

Запрос инициализируется из MVC. Это мой контроллер.

 [UserAuthorize]
[Area("Shared")]
public class FilesController : Controller
{
    public async Task<IActionResult> DownloadFile([FromServices] AzurePrivateStorage azure, int id)
    {
        try
        {
            await CheckDownloadAccess(id);
        }
        catch (UnauthorizedUserAccessException)
        {
            return StatusCode(StatusCodes.Status401Unauthorized);
        }
        catch (FileNotFoundException)
        {
            return StatusCode(StatusCodes.Status404NotFound);
        }
        return new PartialContentResult(id, azure);
    }

    [...]
}
  

Я пробовал как Kestrel, так и IIS Express, но результаты те же. Заголовок диапазона отсутствует на сервере.

Я использую .NET Core 3.1.4.

Комментарии:

1. Отсутствует откуда? Запрос или ответ? IActionResult используется для генерации ответа. Где код, который обрабатывает запрос?

2. Спасибо за ваш комментарий. Я обновил исходное сообщение, чтобы включить часть контроллера.

3. Я попытался настроить простой проект на video response. Здесь сервер Kestrel не предоставляет заголовок диапазона, но IIS Express предоставляет заголовок диапазона. Проблема существует как в .NET Core 3.1.4, так и в .NET Core 5.0.0-предварительный просмотр.7 (последняя версия).

4. Если это действительно проблема Kestrel, вы сможете проверить это, вернув File результат с EnableRangeProcessing значением set. Вы можете либо использовать перегрузку File() , которая принимает enableRangeProcessing , либо явно задать свойство для возвращаемого FileResult объекта. Одним из способов было бы return File(...){EnableRangeProcessing=true};

5. Я настроил тестовый пример на github: github.com/hermandsen/RangeTest При EnableRangeProcessing включенном режиме заголовок диапазона не отправляется при запуске Kestrel.