以编程方式从 Azure blob 存储连接字符串中提取属性

use*_*704 5 c# azure azure-storage-blobs

给定一个 blob 存储连接字符串,例如:

DefaultEndpointsProtocol=https;AccountName=foo;AccountKey=bar;EndpointSuffix=core.windows.net

是否有已知的 Microsoft 对象可以将其转换/反序列化为?我不想实际解析字符串,但我需要从整个连接字符串中提取 AccountName 和 AccountKey,我有一个字符串。

预先阻止可能的“你为什么要这样做?” 问题...我有一个现有的类,需要将连接字符串作为字符串注入。为避免破坏性更改,我无法更改它。但是我确实需要在这个类中添加一些需要 AccountName 和 AccountKey 作为单独项目的方法。

谢谢!

Dav*_*gon 7

如果您安装Microsoft.Azure.Storage.Common,您可以以编程方式提取连接字符串的几位,而无需自己解析连接字符串。

例如(混淆了实际信息):

using System;
using Microsoft.Azure.Storage;

namespace dotnet_connectionstring
{
    class Program
    {
        static void Main(string[] args)
        {
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=youraccount;AccountKey=yourkey==;EndpointSuffix=core.windows.net");
            Console.WriteLine(storageAccount.BlobEndpoint);
            Console.WriteLine("---");
            Console.WriteLine(storageAccount.BlobStorageUri);
            Console.WriteLine("---");
            Console.WriteLine(storageAccount.Credentials.AccountName);
            Console.WriteLine("---");
            Console.WriteLine(storageAccount.Credentials.ExportBase64EncodedKey());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这给出了类似的输出:

https://youraccount.blob.core.windows.net/
---
主 = 'https://youraccount.blob.core.windows.net/'; 次要 = 'https://youraccount-secondary.blob.core.windows.net/'
---
你的帐户
---
你的钥匙==

  • 我需要从连接字符串中提取帐户密钥,因为我需要生成 SAS,如果没有需要帐户密钥的“StorageSharedKeyCredential”,就不可能发生这种情况。耻辱。 (2认同)

Pat*_*vay 5

据我所知,没有任何类可以做到这一点,但将其更改为字典并不难。下面举例。

        string connString = "DefaultEndpointsProtocol=https;AccountName=foo;AccountKey=bar;EndpointSuffix=core.windows.net";

        var connStringArray = connString.Split(';');

        var dictionary = new Dictionary<string, string>();

        foreach (var item in connStringArray)
        {
            var itemKeyValue = item.Split('=');
            dictionary.Add(itemKeyValue[0], itemKeyValue[1]);
        }
Run Code Online (Sandbox Code Playgroud)

然后你可以使用它访问你需要的值。

dictionary["AccountName"]
dictionary["AccountKey"]
Run Code Online (Sandbox Code Playgroud)