Biorąc pod uwagę parametry połączenia magazynu obiektów blob, takie jak:

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

Czy istnieje znany obiekt firmy Microsoft, na który można go przekonwertować / zdeserializować? Nie chcę faktycznie analizować ciągu, ale muszę wyodrębnić AccountName i AccountKey z całego ciągu połączenia, który mam jako ciąg.

Aby zapobiec ewentualnemu „Dlaczego chcesz to zrobić?” pytania ... Mam istniejącą klasę, która wymaga, aby parametry połączenia zostały wprowadzone jako ciąg. Aby uniknąć przełomowych zmian, nie mogę tego zmienić. Ale muszę dodać niektóre metody w tej klasie, które wymagają AccountName i AccountKey jako oddzielnych elementów.

Dzięki!

5
Casey Crookston 2 kwiecień 2020, 21:14

4 odpowiedzi

Najlepsza odpowiedź

Jeśli zainstalujesz Microsoft.Azure.Storage.Common, możesz programowo wyodrębnić kilka bitów parametrów połączenia, bez samodzielnego analizowania parametrów połączenia.

Na przykład (z zaciemnionymi aktualnymi informacjami):

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());
        }
    }
}

To daje wynik mniej więcej tak:

https://youraccount.blob.core.windows.net/
---
Primary = 'https://youraccount.blob.core.windows.net/'; Secondary = 'https://youraccount-secondary.blob.core.windows.net/'
---
youraccount
---
yourkey==
5
David Makogon 2 kwiecień 2020, 19:08

Odpowiedź @David Makogon jest z pewnością najbardziej elegancka, ale pakiet Microsoft.Azure.Storage.Common jest przestarzały (jak stwierdzono w komentarzach). W oparciu o odpowiedź @Patrick Mcvay (która jest trochę błędna, ponieważ w wartościach parametrów połączenia może znajdować się `` = ''), prostym sposobem przeanalizowania parametrów połączenia byłby:

var parsedConnectionString = new Dictionary<string, string>();
foreach (var item in ConnectionString.Split(';'))
{
    var idx = item.IndexOf('=');
    parsedConnectionString[item.Substring(0, idx)] =
        item.Substring(idx + 1, item.Length - idx - 1);
}
1
Vince.Bdn 2 luty 2021, 10:20

W tym celu mamy typ CloudStorageAccount z Microsoft.WindowsAzure.Storage zespołu.

CloudStorageAccount sa = CloudStorageAccount.Parse(connString);
2
OxQ 3 grudzień 2020, 16:06

Nie ma takich klas, które znam, ale nie byłoby trudno zamienić to w słownik. Przykład poniżej.

        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]);
        }

Następnie możesz uzyskać dostęp do potrzebnych wartości, używając tego.

dictionary["AccountName"]
dictionary["AccountKey"]
4
Patrick Mcvay 2 kwiecień 2020, 18:28