使用 Azure 存储管理库查询 Blob 存储终结点

Blob 存储终结点构成了存储帐户中所有对象的基址。

当应用程序创建连接到 Blob 存储数据资源的服务客户端对象时,需要将引用终结点的 URI 传递给服务客户端构造函数。 可以手动构造 URI 字符串,也可以在运行时使用 Azure 存储管理库查询服务终结点。

重要

在客户端应用程序中引用服务终结点时,建议避免依赖于缓存的 IP 地址。 存储帐户 IP 地址可能会更改,因此依赖缓存的 IP 地址可能会导致意外行为。

此外,建议遵循 DNS 记录的生存时间 (TTL),避免重写该时间。 重写 DNS TTL 可能会导致意外行为。

Azure 存储管理库提供对 Azure 存储资源提供程序的编程访问权限。 该资源提供程序是 Azure 资源管理器的 Azure 存储实现。 管理库使开发人员能够管理存储帐户和帐户配置,以及配置生命周期管理策略、对象复制策略和不可变性策略。

本文介绍如何使用 Azure 存储管理库查询 Blob 存储终结点。 然后,使用该终结点创建 BlobServiceClient 对象以连接 Blob 存储数据资源。

设置项目

要使用本文中的代码示例,请按照以下步骤设置项目。

安装包

安装包以使用本示例中使用的库。

使用 dotnet add package 安装以下包:

dotnet add package Azure.Identity
dotnet add package Azure.ResourceManager.Storage
dotnet add package Azure.Storage.Blobs

设置应用代码

将所需的 usingimport 指令添加到代码中。 请注意,代码示例可能会在文件之间划分功能,但在本节中,所有指令都一起列出。

然后,添加以下 using 指令:

using Azure.Core;
using Azure.Identity;
using Azure.Storage.Blobs;
using Azure.ResourceManager;
using Azure.ResourceManager.Resources;
using Azure.ResourceManager.Storage;

客户端库信息:

  • Azure.Identity:跨 Azure SDK 提供 Microsoft Entra 令牌身份验证支持,并且它是与 Azure 服务进行无密码连接所必需的。
  • Azure.ResourceManager.Storage:支持管理 Azure 存储资源,包括资源组和存储帐户。
  • Azure.Storage.Blobs:包含可用于处理 Blob 存储数据资源的主要类。

在订阅中注册存储资源提供程序

必须先在 Azure 订阅中注册资源提供程序,然后才能使用它。 只需为每个订阅执行此步骤一次,并且仅当资源提供程序 Microsoft.Storage 当前未在订阅中注册时才适用。

可以使用 Azure 门户Azure CLIAzure PowerShell 注册存储资源提供程序或检查注册状态。

还可以使用 Azure 管理库来检查注册状态并注册存储资源提供程序,如以下示例所示:

public static async Task RegisterSRPInSubscription(SubscriptionResource subscription)
{
    ResourceProviderResource resourceProvider = 
        await subscription.GetResourceProviderAsync("Microsoft.Storage");

    // Check the registration state of the resource provider and register, if needed
    if (resourceProvider.Data.RegistrationState == "NotRegistered")
        resourceProvider.Register();
}

注意

若要执行注册操作,需要具有以下 Azure RBAC 操作的相关权限:Microsoft.Storage/register/action。 此权限包含在“参与者”和“所有者”角色中。

查询 Blob 存储终结点

若要检索给定存储帐户的 Blob 存储终结点,需要通过调用“获取属性”操作来获取存储帐户属性。 以下代码示例使用数据访问和管理库来获取指定存储帐户的 Blob 存储终结点:

若要获取指定存储帐户的属性,请使用 StorageAccountCollection 对象中的以下方法:

此方法将返回一个表示存储帐户的 StorageAccountResource 对象。

public static async Task<Uri> GetBlobServiceEndpoint(
    string storageAccountName,
    TokenCredential credential)
{
    // TODO: replace with your subscription ID and resource group name
    // You can locate your subscription ID on the Subscriptions blade
    // of the Azure portal (https://portal.azure.cn)
    const string subscriptionId = "<subscription-id>";
    const string rgName = "<resource-group-name>";

    ArmClient armClient = new(credential, subscriptionId, new ArmClientOptions { Environment = ArmEnvironment.AzureChina });

    // Create a resource identifier, then get the subscription resource
    ResourceIdentifier resourceIdentifier = new($"/subscriptions/{subscriptionId}");
    SubscriptionResource subscription = armClient.GetSubscriptionResource(resourceIdentifier);

    // Get a resource group
    ResourceGroupResource resourceGroup = await subscription.GetResourceGroupAsync(rgName);

    // Get a collection of storage account resources
    StorageAccountCollection accountCollection = resourceGroup.GetStorageAccounts();

    // Get the properties for the specified storage account
    StorageAccountResource storageAccount = await accountCollection.GetAsync(storageAccountName);

    // Return the primary endpoint for the blob service
    return storageAccount.Data.PrimaryEndpoints.BlobUri;
}

使用终结点创建客户端对象

拥有存储帐户的 Blob 存储终结点后,可以实例化客户端对象以使用数据资源。 以下代码示例使用我们在前面示例中检索到的终结点来创建 BlobServiceClient 对象:

// Create an instance of DefaultAzureCredential for authorization
TokenCredential credential = new DefaultAzureCredential();

// TODO: replace with your storage account name
string storageAccountName = "<storage-account-name>";

// Call out to our function that retrieves the blob service endpoint for the given storage account
Uri blobURI = await AccountProperties.GetBlobServiceEndpoint(storageAccountName, credential);
Console.WriteLine($"URI: {blobURI}");

// Now that we know the endpoint, create the client object
BlobServiceClient blobServiceClient = new(blobURI, credential);

// Do something with the storage account or its resources ...

后续步骤

查看完整的代码示例 (GitHub):

若要详细了解如何创建客户端对象,请参阅创建和管理与数据资源交互的客户端对象