Потоковое видео из Azure Blob Storage - PullRequest
0 голосов
/ 27 апреля 2020

Я уже давно пробую это, но, похоже, не могу найти идеальный способ сделать это документированным (или продемонстрированным) где-либо

Вот мой код; который заимствовал биты у здесь и здесь среди других мест

[HttpGet("File/{id}")]
public IActionResult Index(int id)
{
    var file = Files(a => a.AttachmentId == id);
    if (file != null)
    {
        //using Azure.Storage.Blobs (v12)
        BlobServiceClient blobServiceClient = new BlobServiceClient(config.GetConnectionString("azBlobConnection"));
        BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(file.BlobContainer);

        BlobClient blobClient = containerClient.GetBlobClient(file.FileName);
        MemoryStream memory = new MemoryStream();
        blobClient.DownloadTo(memory, null, new StorageTransferOptions {
            InitialTransferLength = 1024 * 1024,
            MaximumConcurrency = 20,
            MaximumTransferLength = 4 * 1024 * 1024
        });
        memory.Position = 0;

        string contentType;
        if (!new FileExtensionContentTypeProvider().TryGetContentType(file.FileName, out contentType))
        {
            contentType = "application/octet-stream";
        }

        Response.Headers.Add(HeaderNames.ContentDisposition, new ContentDisposition
        {
            FileName = file.FileName,
            Inline = true,
        }.ToString());

        return File(memory, contentType, true);
    }

    Response.StatusCode = 404;
    return null;
}

Это наконец работает, и я получаю в браузере доступное для поиска видео, которое воспроизводится хорошо. Моя проблема сейчас, если загрузка идет медленно и, похоже, не полностью учитывает заголовки диапазона, поступающие из браузера.

Вот сетевой след от Safari:

safari network trace with range headers for video

Сказанное выше действительно означает, что файл загружается с Azure 3 раза, несмотря на данные, возвращаемые в браузер; что сделает его медленным и неэффективным ...

Кроме того, я заметил, что решение того, что мне, вероятно, нужно, приходит из параметра HttpRange в этом методе: Download(HttpRange, BlobRequestConditions, Boolean, CancellationToken)

Моя проблема в том, что я не могу получить ответ, который можно найти, если я использую метод Download, единственный способ заставить его работать - это использовать DownloadTo(stream), как указано выше.

Что лучше способ сделать это ...?

Большое спасибо!

...