Как перейти на Azure.Storage.Common с Microsoft.WindowsAzure.Storage?

Я реализовал функцию обслуживания видео из хранилища BLOB-объектов Azure в приложении MVC с помощью Microsoft.WindowsAzure.Storage. Приведенный ниже код контроллера работает и демонстрирует базовые функции получения URL-адреса для обслуживания. Он используется вместе с представлением Videos.cshtml, показанным ниже.

Хотя это работает, WindowsAzure.Storage устарела, и Microsoft рекомендует выполнить обновление до Azure.Storage.Common. Однако этот пакет, похоже, не имеет одинаковых методов, и я не могу найти хорошего справочника по переходу с Microsoft.WindowsAzure.Storage на Azure.Storage.Common.

Может ли кто-нибудь указать мне хороший справочник/учебник по преобразованию приведенного ниже кода? Еще лучше, если бы кто-нибудь мог подробно показать, как преобразовать этот код, мы были бы очень признательны!

Код контроллера

using System;
using System.Configuration;
using System.Web.Mvc;

/*
 * Requires installing WindowsAzure.Storage via Nuget manager
 * Note deprecated! - recommended to use Azure.Storage.Common
 * Additional Details:
 * Please note, this package is obsolete as of 3/31/2023 and is no longer maintained or monitored. 
 * Microsoft encourages you to upgrade to the replacement package, Azure.Storage.Common, to 
 * continue receiving updates. Refer to our deprecation policy 
 * (https://aka.ms/azsdk/support-policies) for more details.
 */
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.WindowsAzure.Storage.Blob;


namespace MyPlatform.Controllers
{

    [Authorize(Roles = "Admin")]
    public class MyController : Controller
    {
        
        /// <summary>
        /// Test page for streaming training videos.
        /// </summary>
        /// <returns>View of the Videos page.</returns>
        public ActionResult Videos()
        {
            // Get strings from Web.config file
            string accountName = ConfigurationManager.AppSettings["Storage:AccountName"];
            string keyValue = ConfigurationManager.AppSettings["Storage:KeyValue"];
            string containerName = ConfigurationManager.AppSettings["Storage:ContainerName"];
            string videoName = ConfigurationManager.AppSettings["Storage:VideoName"];

            var credentials = new StorageCredentials(accountName, keyValue);
            var account = new CloudStorageAccount(credentials, true); // true for using HTTPS
            var container = account.CreateCloudBlobClient().GetContainerReference(containerName);
            var blob = container.GetBlockBlobReference(videoName);

            // Need URL to stream video. To get URL, need to set up permissions
            var sharedAccessSig = blob.GetSharedAccessSignature(new SharedAccessBlobPolicy()
            {
                Permissions = SharedAccessBlobPermissions.Read,
                SharedAccessExpiryTime = DateTime.UtcNow.AddHours(1)
            });

            string videoUrl = string.Format("{0}{1}", blob.Uri, sharedAccessSig);

            ViewData["Video"] = videoUrl; 

            return View();
        }


    }
}

Код просмотра

Приведенный выше код используется вместе с представлением


@{
    ViewBag.Title = "Videos";
    Layout = "~/Views/Shared/_MyLayout.cshtml";

    var videoUrl = (string)ViewData["Video"];
 
}

<h2>Videos</h2>

<p>Test page for streaming videos.</p>

<video controls controlslist = "nodownload" disablepictureinpicture>
    <source src=@videoUrl type = "video/mp4">
</video>

К вашему сведению, простая передача видео из хранилища BLOB-объектов не является «потоковой передачей» видео. «Потоковое вещание» обычно относится к (ре)трансляции все еще действующего источника видео (например, такого как Twitch).

Dai 27.08.2024 12:15

@Dai Спасибо, я соответствующим образом отредактировал терминологию.

Martin Vaughan 27.08.2024 13:14

Соответствующие примеры находятся на github.com/Azure/azure-sdk-for-net/blob/… — вы не видели эту страницу?

Dai 27.08.2024 13:20
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  1. Azure.Storage.Common это не то, что ты хочешь - ты хочешь Azure.Storage.Blobs.
  2. Использование первичных/вторичных ключей учетной записи хранения по-прежнему поддерживается, но их использование не поощряется.
    • Вместо этого, если (и когда) ваше приложение работает в Службе приложений Azure или на виртуальной машине Azure, используйте Управляемое удостоверение для доступа к другим ресурсам Azure в вашей Подписке вообще без необходимости использования каких-либо паролей/ключей/кодов/секретов.

Изменения API:

  • StorageSharedKeyCredential заменяет StorageCredentials.
  • BlobServiceClient заменяет CloudStorageAccount.
  • BlobContainerClient заменяет CloudBlobContainer.
  • BlobClient заменяет CloudBlob; а его подклассы (CloudBlockBlob, CloudPageBlob и CloudAppendBlob) заменяются типами в Azure.Storage.Blobs.Specialized.
  • Чтобы создать URI SAS для большого двоичного объекта, используйте BlobSasBuilder.

Вот так:

Старый:

StorageCredentials  credentials = new StorageCredentials(accountName, keyValue);
CloudStorageAccount account     = new CloudStorageAccount(credentials, true);

CloudBlobContainer  container   = account.CreateCloudBlobClient().GetContainerReference(containerName);
CloudBlockBlob      blob        = container.GetBlockBlobReference(videoName);

String sharedAccessSig = blob.GetSharedAccessSignature(new SharedAccessBlobPolicy()
{
    Permissions            = SharedAccessBlobPermissions.Read,
    SharedAccessExpiryTime = DateTime.UtcNow.AddHours(1)
});

String videoUrl = string.Format("{0}{1}", blob.Uri, sharedAccessSig);

Новый:

using Azure.Storage;
using Azure.Storage.Blobs;
using Azure.Storage.Sas; // For `BlobSasBuilder`

// ...

StorageSharedKeyCredential sharedKeyCredential = new StorageSharedKeyCredential(accountName, accountKey);

BlobServiceClient svcClient = new BlobServiceClient(
    serviceUri: new Uri("https://" + accountName + ".blob.core.windows.net"),
    credential: sharedKeyCredential
);

BlobContainerClient container = svcClient.GetBlobContainerClient(blobContainerName: containerName);
BlobClient blob = container.GetBlobClient(blobName: videoName);

BlobSasBuilder bsb = new BlobSasBuilder(
    permissions: BlobSasPermissions.Read,
    expiresOn  : DateTimeOffset.Now.AddHours(1)
)
{
    BlobContainerName = containerName,
    BlobName          = videoName
};

BlobSasQueryParameters sasQueryParameters = bsb.ToSasQueryParameters(sharedKeyCredential);

UriBuilder ub = new UriBuilder()
{
    Scheme = "https",
    Host   = accountName + ".blob.core.windows.net",
    Path   = containerName + "/" + videoName,
    Query  = sasQueryParameters.ToString()
};

Uri videoUri = ub.Uri;

Признаюсь, я удивлен тем, сколько усилий требуется для использования BlobSasBuilderBlobSasQueryParameters и UriBuilder). Я надеюсь/предполагаю, что для этого есть короткий путь, но я не искал глубже.


Другие вопросы по теме