Я реализовал функцию обслуживания видео из хранилища 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>
@Dai Спасибо, я соответствующим образом отредактировал терминологию.
Соответствующие примеры находятся на github.com/Azure/azure-sdk-for-net/blob/… — вы не видели эту страницу?
Azure.Storage.Common
это не то, что ты хочешь - ты хочешь Azure.Storage.Blobs
.
Azure.Storage.Blobs
сам Azure.Storage.Common указывает как зависимость)Изменения API:
StorageSharedKeyCredential
заменяет StorageCredentials
.BlobServiceClient
заменяет CloudStorageAccount
.BlobContainerClient
заменяет CloudBlobContainer
.BlobClient
заменяет CloudBlob
; а его подклассы (CloudBlockBlob
, CloudPageBlob
и CloudAppendBlob
) заменяются типами в Azure.Storage.Blobs.Specialized.BlobSasBuilder
.
BlobClient
для создания SAS для BLOB-объекта.Старый:
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;
Признаюсь, я удивлен тем, сколько усилий требуется для использования BlobSasBuilder
(с BlobSasQueryParameters
и UriBuilder
). Я надеюсь/предполагаю, что для этого есть короткий путь, но я не искал глубже.
К вашему сведению, простая передача видео из хранилища BLOB-объектов не является «потоковой передачей» видео. «Потоковое вещание» обычно относится к (ре)трансляции все еще действующего источника видео (например, такого как Twitch).