Speichern und Zugreifen auf Daten in Azure Storage aus Xamarin.Forms
Azure Storage ist eine skalierbare Cloudspeicherlösung, die zum Speichern unstrukturierter und strukturierter Daten verwendet werden kann. In diesem Artikel wird die Verwendung Xamarin.Forms zum Speichern von Text- und Binärdaten in Azure Storage und zum Zugreifen auf die Daten veranschaulicht.
Azure Storage bietet vier Speicherdienste:
- Blobspeicher. Ein Blob kann Text- oder Binärdaten sein, z. B. Sicherungen, virtuelle Computer, Mediendateien oder Dokumente.
- Tabellenspeicher ist ein NoSQL-Schlüssel-Attributspeicher.
- Warteschlangenspeicher ist ein Messagingdienst für die Workflowverarbeitung und die Kommunikation zwischen Clouddiensten.
- Der Dateispeicher stellt gemeinsam genutzten Speicher mithilfe des SMB-Protokolls bereit.
Zwei Typen von Speicherkonten stehen zur Verfügung:
- Ein allgemeines Speicherkonto bietet Zugriff auf Azure Storage-Dienste über ein einzelnes Konto.
- Ein BLOB-Speicherkonto ist ein spezielles Speicherkonto zum Speichern von Blobs. Dieser Kontotyp wird empfohlen, wenn Sie nur BLOB-Daten speichern müssen.
In diesem Artikel und der zugehörigen Beispielanwendung wird das Hochladen von Bild- und Textdateien in blob-Speicher und das Herunterladen veranschaulicht. Darüber hinaus wird das Abrufen einer Liste von Dateien aus blob-Speicher und das Löschen von Dateien veranschaulicht.
Weitere Informationen zu Azure Storage finden Sie in der Einführung in den Speicher.
Hinweis
Wenn Sie kein Azure-Abonnement besitzen, erstellen Sie ein kostenloses Konto, bevor Sie beginnen.
Einführung in Blob Storage
Blob-Speicher besteht aus drei Komponenten, die im folgenden Diagramm dargestellt werden:
Der gesamte Zugriff auf Azure Storage erfolgt über ein Speicherkonto. Ein Speicherkonto kann eine unbegrenzte Anzahl von Containern enthalten, und ein Container kann eine unbegrenzte Anzahl von Blobs bis zum Kapazitätslimit des Speicherkontos speichern.
Ein Blob ist eine Datei mit beliebigem Typ und jeder Größe. Azure Storage unterstützt drei verschiedene BLOB-Typen:
- Block-Blobs sind für das Streamen und Speichern von Cloudobjekten optimiert und eignen sich hervorragend zum Speichern von Sicherungen, Mediendateien, Dokumenten usw. Block-Blobs können bis zu 195 Gb groß sein.
- Anfügeblobs ähneln Block-Blobs, sind jedoch für Anfügevorgänge optimiert, z. B. protokollierung. Append blobs can be up to 195Gb in size.
- Seitenblobs sind für häufige Lese-/Schreibvorgänge optimiert und werden in der Regel zum Speichern virtueller Computer und deren Datenträger verwendet. Seitenblobs können bis zu 1 TB groß sein.
Hinweis
Beachten Sie, dass BLOB-Speicherkonten Block- und Anfüge-Blobs unterstützen, jedoch keine Seitenblobs.
Ein BLOB wird in Azure Storage hochgeladen und aus Azure Storage als Bytestream heruntergeladen. Daher müssen Dateien vor dem Hochladen in einen Bytestrom konvertiert und nach dem Download wieder in ihre ursprüngliche Darstellung konvertiert werden.
Jedes Objekt, das in Azure Storage gespeichert ist, verfügt über eine eindeutige URL-Adresse. Der Name des Speicherkontos bildet den Unterdo Standard dieser Adresse und die Kombination aus Unterdo Standard und do Standard name bildet einen Endpunkt für das Speicherkonto. Wenn Ihr Speicherkonto beispielsweise "mystorageaccount" heißt, lautet https://mystorageaccount.blob.core.windows.net
der Standard-BLOB-Endpunkt für das Speicherkonto.
Die URL für den Zugriff auf ein Objekt in einem Speicherkonto wird durch Anhängen des Objektstandorts im Speicherkonto an den Endpunkt generiert. Beispielsweise weist eine BLOB-Adresse das Format https://mystorageaccount.blob.core.windows.net/mycontainer/myblob
auf.
Setup
Der Prozess für die Integration eines Azure Storage-Kontos in eine Xamarin.Forms Anwendung lautet wie folgt:
- Erstellen Sie ein Speicherkonto. Weitere Informationen finden Sie unter Erstellen eines Speicherkontos.
- Fügen Sie der Anwendung die Azure Storage-Clientbibliothek hinzu Xamarin.Forms .
- Konfigurieren Sie den Speicher Verbindungszeichenfolge. Weitere Informationen finden Sie unter Verbinden ing to Azure Storage.
- Fügen Sie
using
Direktiven für dieMicrosoft.WindowsAzure.Storage
Klassen undMicrosoft.WindowsAzure.Storage.Blob
Namespaces hinzu, die auf Azure Storage zugreifen.
Herstellen einer Verbindung mit Azure Storage
Jede Anforderung für Speicherkontoressourcen muss authentifiziert werden. Während Blobs so konfiguriert werden können, dass die anonyme Authentifizierung unterstützt wird, gibt es zwei Standard Ansätze, mit denen eine Anwendung sich mit einem Speicherkonto authentifizieren kann:
- Gemeinsam verwendete Schlüssel. Bei diesem Ansatz wird der Name und der Kontoschlüssel des Azure Storage-Kontos verwendet, um auf Speicherdienste zuzugreifen. Einem Speicherkonto werden zwei private Schlüssel zur Erstellung zugewiesen, die für die Authentifizierung gemeinsam genutzter Schlüssel verwendet werden können.
- Signatur für freigegebenen Zugriff. Dies ist ein Token, das an eine URL angefügt werden kann, die delegierten Zugriff auf eine Speicherressource ermöglicht, mit den berechtigungen, die er angibt, für den Zeitraum, der gültig ist.
Verbinden ion-Zeichenfolgen können angegeben werden, die die Authentifizierungsinformationen enthalten, die für den Zugriff auf Azure Storage-Ressourcen aus einer Anwendung erforderlich sind. Darüber hinaus kann ein Verbindungszeichenfolge so konfiguriert werden, dass eine Verbindung mit dem Azure-Speicheremulator von Visual Studio hergestellt wird.
Hinweis
Azure Storage unterstützt HTTP und HTTPS in einem Verbindungszeichenfolge. Die Verwendung von HTTPS wird jedoch empfohlen.
Verbinden zum Azure Storage-Emulator
Der Azure-Speicheremulator stellt eine lokale Umgebung bereit, in der die Azure-Blob-, Warteschlangen- und Tabellendienste für Entwicklungszwecke emuliert werden.
Die folgenden Verbindungszeichenfolge sollten zum Herstellen einer Verbindung mit dem Azure-Speicheremulator verwendet werden:
UseDevelopmentStorage=true
Weitere Informationen zum Azure Storage-Emulator finden Sie unter Verwenden des Azure-Speicheremulators für Entwicklung und Tests.
Verbinden mit einem freigegebenen Schlüssel in Azure Storage
Das folgende Verbindungszeichenfolge Format sollte verwendet werden, um eine Verbindung mit Azure Storage mit einem freigegebenen Schlüssel herzustellen:
DefaultEndpointsProtocol=[http|https];AccountName=myAccountName;AccountKey=myAccountKey
myAccountName
sollte durch den Namen Ihres Speicherkontos ersetzt werden und myAccountKey
durch einen Ihrer beiden Kontozugriffsschlüssel ersetzt werden.
Hinweis
Bei Verwendung der Authentifizierung mit gemeinsam genutztem Schlüssel wird Ihr Kontoname und Der Kontoschlüssel an jede Person verteilt, die Ihre Anwendung verwendet, wodurch der vollständige Lese-/Schreibzugriff auf das Speicherkonto bereitgestellt wird. Verwenden Sie daher die gemeinsame Schlüsselauthentifizierung nur zu Testzwecken, und verteilen Sie Schlüssel niemals an andere Benutzer.
Verbinden mithilfe einer Signatur für freigegebenen Zugriff in Azure Storage
Das folgende Verbindungszeichenfolge Format sollte verwendet werden, um eine Verbindung mit Azure Storage mit einer SAS herzustellen:
BlobEndpoint=myBlobEndpoint;SharedAccessSignature=mySharedAccessSignature
myBlobEndpoint
sollte durch die URL Ihres BLOB-Endpunkts ersetzt werden und mySharedAccessSignature
durch Ihre SAS ersetzt werden. Die SAS stellt das Protokoll, den Dienstendpunkt und die Anmeldeinformationen für den Zugriff auf die Ressource bereit.
Hinweis
Die SAS-Authentifizierung wird für Produktionsanwendungen empfohlen. In einer Produktionsanwendung sollte die SAS jedoch von einem Back-End-Dienst bei Bedarf abgerufen werden, anstatt mit der Anwendung gebündelt zu werden.
Weitere Informationen zu Signaturen für den freigegebenen Zugriff finden Sie unter Verwenden von Freigegebenen Zugriffssignaturen (SAS).
Erstellen eines Containers
Die GetContainer
Methode wird verwendet, um einen Verweis auf einen benannten Container abzurufen, der dann zum Abrufen von Blobs aus dem Container oder zum Hinzufügen von Blobs zum Container verwendet werden kann. Die GetContainer
-Methode wird in folgendem Codebeispiel veranschaulicht:
static CloudBlobContainer GetContainer(ContainerType containerType)
{
var account = CloudStorageAccount.Parse(Constants.StorageConnection);
var client = account.CreateCloudBlobClient();
return client.GetContainerReference(containerType.ToString().ToLower());
}
Die CloudStorageAccount.Parse
Methode analysiert eine Verbindungszeichenfolge und gibt eine CloudStorageAccount
Instanz zurück, die das Speicherkonto darstellt. Eine CloudBlobClient
Instanz, die zum Abrufen von Containern und Blobs verwendet wird, wird dann von der CreateCloudBlobClient
Methode erstellt. Die GetContainerReference
Methode ruft den angegebenen Container als CloudBlobContainer
Instanz ab, bevor er an die aufrufende Methode zurückgegeben wird. In diesem Beispiel ist der Containername der ContainerType
Enumerationswert, der in eine kleingeschriebene Zeichenfolge konvertiert wird.
Hinweis
Containernamen müssen klein geschrieben sein und müssen mit einem Buchstaben oder einer Zahl beginnen. Darüber hinaus können sie nur Buchstaben, Zahlen und das Gedankenstrichzeichen enthalten und müssen zwischen 3 und 63 Zeichen lang sein.
Die GetContainer
Methode wird wie folgt aufgerufen:
var container = GetContainer(containerType);
Die CloudBlobContainer
Instanz kann dann verwendet werden, um einen Container zu erstellen, wenn er noch nicht vorhanden ist:
await container.CreateIfNotExistsAsync();
Standardmäßig ist ein neu erstellter Container privat. Dies bedeutet, dass ein Speicherzugriffsschlüssel angegeben werden muss, um Blobs aus dem Container abzurufen. Informationen zum Erstellen von Blobs innerhalb eines Containers finden Sie unter Erstellen eines Containers.
Hochladen von Daten in einen Container
Die UploadFileAsync
Methode wird verwendet, um einen Datenstrom von Bytedaten in BLOB-Speicher hochzuladen und wird im folgenden Codebeispiel gezeigt:
public static async Task<string> UploadFileAsync(ContainerType containerType, Stream stream)
{
var container = GetContainer(containerType);
await container.CreateIfNotExistsAsync();
var name = Guid.NewGuid().ToString();
var fileBlob = container.GetBlockBlobReference(name);
await fileBlob.UploadFromStreamAsync(stream);
return name;
}
Nach dem Abrufen eines Containerverweises erstellt die Methode den Container, falls er noch nicht vorhanden ist. Anschließend wird ein neues Guid
erstellt, um als eindeutiger BLOB-Name zu fungieren, und ein Blob-Blockverweis wird als CloudBlockBlob
Instanz abgerufen. Der Datenstrom wird dann mithilfe der UploadFromStreamAsync
Methode in das Blob hochgeladen, wodurch das Blob erstellt wird, wenn er noch nicht vorhanden ist, oder überschreibt ihn, wenn er vorhanden ist.
Bevor eine Datei mit dieser Methode in blob storage hochgeladen werden kann, muss sie zuerst in einen Bytedatenstrom konvertiert werden. Dies wird im folgenden Codebeispiel veranschaulicht:
var byteData = Encoding.UTF8.GetBytes(text);
uploadedFilename = await AzureStorage.UploadFileAsync(ContainerType.Text, new MemoryStream(byteData));
Die text
Daten werden in ein Bytearray konvertiert, das dann als Datenstrom umbrochen wird, der an die UploadFileAsync
Methode übergeben wird.
Herunterladen von Daten aus einem Container
Die GetFileAsync
Methode wird verwendet, um BLOB-Daten aus Azure Storage herunterzuladen und wird im folgenden Codebeispiel gezeigt:
public static async Task<byte[]> GetFileAsync(ContainerType containerType, string name)
{
var container = GetContainer(containerType);
var blob = container.GetBlobReference(name);
if (await blob.ExistsAsync())
{
await blob.FetchAttributesAsync();
byte[] blobBytes = new byte[blob.Properties.Length];
await blob.DownloadToByteArrayAsync(blobBytes, 0);
return blobBytes;
}
return null;
}
Nach dem Abrufen eines Containerverweises ruft die Methode einen BLOB-Verweis für die gespeicherten Daten ab. Wenn das Blob vorhanden ist, werden die Eigenschaften von der FetchAttributesAsync
Methode abgerufen. Ein Bytearray der richtigen Größe wird erstellt, und das BLOB wird als Array von Bytes heruntergeladen, die an die aufrufende Methode zurückgegeben werden.
Nach dem Herunterladen der BLOB-Bytedaten muss sie in die ursprüngliche Darstellung konvertiert werden. Dies wird im folgenden Codebeispiel veranschaulicht:
var byteData = await AzureStorage.GetFileAsync(ContainerType.Text, uploadedFilename);
string text = Encoding.UTF8.GetString(byteData);
Das Bytearray wird von Azure Storage von der GetFileAsync
Methode abgerufen, bevor es wieder in eine UTF8-codierte Zeichenfolge konvertiert wird.
Auflisten von Daten in einem Container
Die GetFilesListAsync
Methode wird verwendet, um eine Liste von Blobs abzurufen, die in einem Container gespeichert sind, und wird im folgenden Codebeispiel gezeigt:
public static async Task<IList<string>> GetFilesListAsync(ContainerType containerType)
{
var container = GetContainer(containerType);
var allBlobsList = new List<string>();
BlobContinuationToken token = null;
do
{
var result = await container.ListBlobsSegmentedAsync(token);
if (result.Results.Count() > 0)
{
var blobs = result.Results.Cast<CloudBlockBlob>().Select(b => b.Name);
allBlobsList.AddRange(blobs);
}
token = result.ContinuationToken;
} while (token != null);
return allBlobsList;
}
Nach dem Abrufen eines Containerverweiss verwendet die Methode des Containers ListBlobsSegmentedAsync
, um Verweise auf die Blobs innerhalb des Containers abzurufen. Die von der ListBlobsSegmentedAsync
Methode zurückgegebenen Ergebnisse werden aufgezählt, während die BlobContinuationToken
Instanz nicht null
vorhanden ist. Jedes Blob wird von der zurückgegebenen IListBlobItem
in eine CloudBlockBlob
Reihenfolge umgewandelt, um auf die Name
Eigenschaft des Blobs zuzugreifen, bevor der Wert der allBlobsList
Auflistung hinzugefügt wird. Sobald die BlobContinuationToken
Instanz lautet null
, wurde der nachgestellte BLOB-Name zurückgegeben, und die Ausführung beendet die Schleife.
Löschen von Daten aus einem Container
Die DeleteFileAsync
Methode wird verwendet, um ein BLOB aus einem Container zu löschen, und wird im folgenden Codebeispiel gezeigt:
public static async Task<bool> DeleteFileAsync(ContainerType containerType, string name)
{
var container = GetContainer(containerType);
var blob = container.GetBlobReference(name);
return await blob.DeleteIfExistsAsync();
}
Nach dem Abrufen eines Containerverweises ruft die Methode einen BLOB-Verweis für das angegebene Blob ab. Das Blob wird dann mit der DeleteIfExistsAsync
Methode gelöscht.