Übung: Konfigurieren und Initialisieren der Clientbibliothek
So sieht der typische Workflow für Apps aus, die Azure Blob Storage verwenden:
Konfiguration abrufen: Laden Sie beim Start die Speicherkontokonfiguration, in der Regel eine Verbindungszeichenfolge für das Speicherkonto.
Initialisieren des Clients: Verwenden Sie die Verbindungszeichenfolge, um die Azure Storage-Clientbibliothek zu initialisieren. Bei dieser Initialisierung werden die Objekte erstellt, die die App für die Arbeit mit der Blob-Speicher-API verwendet.
Verwenden: Um mit Containern und Blobs zu arbeiten, führen Sie API-Aufrufe mit der Clientbibliothek durch.
Konfigurieren der Verbindungszeichenfolge
Bevor Sie Ihre App ausführen, rufen Sie die Verbindungszeichenfolge für das von Ihnen verwendete Speicherkonto ab. Sie können dafür jede beliebige Azure-Verwaltungsschnittstelle verwenden, einschließlich des Azure-Portals, der Azure-CLI und der Azure PowerShell. Wenn Sie die Web-App zur Ausführung Ihres Codes am Ende dieses Moduls einrichten, verwenden Sie die Azure CLI, um die Verbindungszeichenfolge für das zuvor erstellte Speicherkonto abzurufen.
Diese enthält den Kontoschlüssel. Betrachten Sie den Kontoschlüssel als Geheimnis, und speichern Sie ihn stets sicher. Hier speichern Sie die Verbindungszeichenfolge in einer App Service-App-Einstellung. Die App Service-App-Einstellungen sind ein sicherer Ort für App-Geheimnisse. Dieses Design unterstützt die lokale Entwicklung nicht und ist für sich allein genommen keine robuste End-to-End-Lösung.
Wichtig
In diesem Codebeispiel wird eine Verbindungszeichenfolge verwendet, um den Zugriff auf Ihr Speicherkonto zu autorisieren. Diese Konfiguration dient nur zu Demonstrationszwecken. Verbindungszeichenfolgen und Kontozugriffsschlüssel sollten im Anwendungscode vorsichtig verwendet werden. Wenn Ihr Kontozugriffsschlüssel verloren geht oder versehentlich an einem unsicheren Ort gespeichert wird, kann Ihr Dienst anfällig werden. Jeder, der über den Zugriffsschlüssel verfügt, kann Anforderungen für das Speicherkonto autorisieren und hat somit Zugriff auf alle Daten.
Um optimale Sicherheit zu gewährleisten, empfiehlt Microsoft möglichst die Verwendung von Microsoft Entra ID mit verwalteten Identitäten, um Anforderungen für Blob-, Warteschlangen- und Tabellendaten zu autorisieren. Weitere Informationen finden Sie unter Autorisieren des Zugriffs auf Blobs mit Microsoft Entra ID.
Initialisieren des Blob Storage-Objektmodells
Im Azure Storage SDK für .NET verläuft die Verwendung von Blob Storage wie folgt:
Sie instanziieren ein neues
BlobServiceClient
-Objekt und geben die Verbindungszeichenfolge für Ihr Speicherkonto an.Um ein
BlobContainerClient
-Objekt abzurufen, rufen SieGetBlobContainerClient
für dasBlobServiceClient
-Objekt auf, das den Namen des Containers trägt, mit dem Sie interagieren oder den Sie erstellen möchten.
Im Code werden diese Schritte wie folgt ausgedrückt.
BlobServiceClient blobServiceClient = new BlobServiceClient(storageConfig.ConnectionString);
BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(storageConfig.FileContainerName);
Keiner dieser Initialisierungscodes führt Aufrufe über das Netzwerk durch. Das bedeutet, dass einige Ausnahmen, die aufgrund von falschen Informationen auftreten, erst später ausgelöst werden. Wenn dem Konstruktor der BlobServiceClient
-Klasse beispielsweise eine falsch formatierte Verbindungszeichenfolge übergeben wird, führt dies sofort zu einer Ausnahme. Wenn die Verbindungszeichenfolge jedoch auf ein Speicherkonto verweist, das nicht existiert, wird keine Ausnahme ausgelöst, bis Sie versuchen, einen Vorgang für das Speicherkonto auszuführen.
Im Azure Storage SDK für Java verläuft die Verwendung von Blob Storage standardmäßig wie folgt:
Erstellen Sie einen
BlobServiceClient
, indem Sie ein neuesBlobServiceClientBuilder
-Objekt mithilfe der Verbindungszeichenfolge für Ihr Speicherkonto instanziieren.Rufen Sie ein
BlobContainerClient
-Objekt ab, indem Sie die MethodegetBlobContainerClient
für denBlobServiceClient
mit dem Namen des Containers aufrufen, mit dem Sie interagieren oder den Sie erstellen möchten.
Im Code werden diese Schritte wie folgt ausgedrückt.
BlobServiceClient blobServiceClient = BlobServiceClientBuilder()
.connectionString(connectionString)
.buildClient();
BlobContainerClient containerClient = blobServiceClient.getBlobContainerClient(containerName);
Keiner dieser Initialisierungscodes führt Aufrufe über das Netzwerk durch. Das bedeutet, dass einige Ausnahmen, die aufgrund von falschen Informationen auftreten, erst später ausgelöst werden. Wenn beispielsweise eine falsch formatierte Verbindungszeichenfolge an BlobServiceClientBuilder
übergeben wird, führt dies sofort zu einer Ausnahme. Wenn die Verbindungszeichenfolge jedoch auf ein Speicherkonto verweist, das nicht existiert, wird keine Ausnahme ausgelöst, bis Sie versuchen, einen Vorgang für das Speicherkonto auszuführen.
Erstellen von Containern beim Start
Rufen Sie CreateIfNotExistsAsync
in BlobContainerClient
auf, um einen Container zu erstellen, wenn Ihre App gestartet wird oder zum ersten Mal versucht, einen Container zu verwenden.
CreateIfNotExistsAsync
löst keine Ausnahme aus, wenn der Container bereits existiert, führt aber einen Netzwerkaufruf an Azure Blob Storage durch. Rufen Sie dieses Element einmalig während der Initialisierung auf, nicht bei jedem Versuch, einen Container zu verwenden.
Um einen Container zu erstellen, wenn Ihre Anwendung startet oder wenn sie zum ersten Mal versucht, ihn zu verwenden, rufen Sie exists
für einen BlobContainerClient
auf, um zu prüfen, ob bereits ein Container existiert. Wenn er nicht vorhanden ist, rufen Sie create
auf. Rufen Sie dieses Element einmalig während der Initialisierung auf, nicht bei jedem Versuch, einen Container zu verwenden.
Übung
Klonen und Untersuchen nicht fertiger Apps
Klonen Sie zuerst die Start-App aus GitHub. Führen Sie die folgenden Befehle in der Azure Shell-CLI aus, um eine Kopie des Quellcodes zu erhalten und ihn im Editor zu öffnen:
git clone https://github.com/MicrosoftDocs/mslearn-store-data-in-azure.git cd mslearn-store-data-in-azure/store-app-data-with-azure-blob-storage/src/start code .
Öffnen Sie im Editor die Datei Controllers/FilesController.cs. Hier gibt es nichts zu tun, aber sehen Sie sich kurz an, was die App kann.
Dieser Controller implementiert eine API mit drei Aktionen:
- Index: (
GET /api/Files
) gibt eine Liste von URLs zurück – eine für jede hochgeladene Datei. Das App-Front-End ruft diese Methode auf, um eine Liste von Hyperlinks zu den hochgeladenen Dateien zu erstellen. - Upload: (
POST /api/Files
) ruft eine hochgeladene Datei ab und speichert sie. - Download: (
GET /api/Files/{filename}
) lädt eine einzelne Datei nach Namen herunter.
Jede Methode verwendet eine
IStorage
-Instanz namensstorage
. Es gibt eine unvollständige Implementierung vonIStorage
in Models/BlobStorage.cs, die ausgefüllt werden muss.- Index: (
Hinzufügen des NuGet-Pakets
Fügen Sie einen Verweis auf das Azure Storage SDK hinzu. Führen Sie in der Azure Shell-CLI die folgenden Befehle aus:
dotnet add package Azure.Storage.Blobs dotnet restore
Durch Ausführen dieses Befehls wird sichergestellt, dass Sie die neueste Version der Blob Storage-Clientbibliothek verwenden.
Konfigurieren
Die erforderlichen Konfigurationswerte sind die Verbindungszeichenfolge des Speicherkontos und der Name des Containers, den die App für die Speicherung von Dateien verwenden wird. In diesem Modul führen Sie die App nur in Azure App Service aus. Folgen Sie der bewährten Methode von App Service und speichern Sie die Werte in den App Service-Einstellungen. Sie tun dies, wenn Sie die App Service-Instanz erstellen. Im Moment brauchen Sie nichts zu tun.
Die Start-App es enthält bereits alle erforderlichen Einstellungen zum Einsatz der Konfiguration. Der Konstruktorparameter IOptions<AzureStorageConfig>
in BlobStorage
hat zwei Eigenschaften: die Speicherkonto-Verbindungszeichenfolge und den Namen des Containers, in dem die App Blobs speichert. In der ConfigureServices
-Methode von Startup.cs
ist Code vorhanden, der die Werte aus der Konfiguration lädt, wenn die App startet.
Initialisieren
Öffnen Sie im Editor die Datei Models/BlobStorage.cs. Fügen Sie die folgenden
using
-Anweisungen am Anfang der Datei hinzu, um sie für den Code vorzubereiten, den Sie hinzufügen werden.using Azure; using Azure.Storage.Blobs; using Azure.Storage.Blobs.Models;
Suchen Sie nach der
Initialize
-Methode. Ihre App ruft diese Methode auf, wenn sieBlobStorage
zum ersten Mal verwendet. Wenn Sie neugierig sind, können Sie sichConfigureServices
in der Datei Startup.cs ansehen, um zu sehen, wie der Aufruf erfolgt.Unter
Initialize
erstellen Sie den Container, falls noch keiner vorhanden ist. Ersetzen Sie die aktuelle Implementierung vonInitialize
durch den folgenden Code und speichern Sie Ihre Arbeit mit STRG+S.public Task Initialize() { BlobServiceClient blobServiceClient = new BlobServiceClient(storageConfig.ConnectionString); BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(storageConfig.FileContainerName); return containerClient.CreateIfNotExistsAsync(); }
Klonen und Untersuchen nicht fertiger Apps
Klonen Sie zuerst die Start-App aus GitHub. Führen Sie die folgenden Befehle in der Azure Shell-CLI aus, um eine Kopie des Quellcodes zu erhalten und ihn im Editor zu öffnen:
git clone https://github.com/MicrosoftDocs/mslearn-store-data-in-azure.git cd mslearn-store-data-in-azure/store-java-ee-application-data-with-azure-blob-storage/start code .
Öffnen Sie im Editor die Datei src/main/java/com/microsoft/azure/samples/jsf/IndexBean.java. Hier gibt es nichts zu tun, aber sehen Sie sich kurz an, was die App kann.
Diese auf den Anforderungsumfang beschränkte Bean implementiert drei Aktionen, die von der JSF-Seite (Java Server Faces) src/main/webapp/index.xhtml verwendet werden:
- listFileNames: Diese Aktion gibt eine Liste der Dateinamen zurück, einen für jede hochgeladene Datei. Die Seite index.xhtml ruft diese Methode auf, um eine Liste der Hyperlinks zu den hochgeladenen Dateien zu erstellen.
- upload: Diese Aktion ruft eine hochgeladene Datei ab und speichert sie. Der Dateiinhalt und die Metadaten werden vom JSF-Framework in die Eigenschaft
uploadedFile
eingefügt. - download: Diese Aktion lädt eine einzelne Datei nach Namen herunter.
Jede Methode verwendet hierfür eine
Storage
-Instanz namensstorage
. Es gibt eine unvollständige Implementierung vonStorage
in src/main/java/com/microsoft/azure/samples/service/BlobStorage.java, die ausgefüllt werden muss.
Hinzufügen des Verweises auf das Azure Storage SDK für Java
Sie sollten Azure BOM verwenden, um Azure-Clientbibliotheken zum Projekt hinzuzufügen. Sie erleichtern die Orchestrierung mehrerer Azure-Clientbibliotheken bei minimalen Abhängigkeitskonflikten.
Öffnen Sie im Editor die Datei pom.xml.
Fügen Sie den folgenden
dependencyManagement
-Abschnitt unter dem XML-Tagproject
hinzu, um Azure-BOMs zum Projekt hinzuzufügen.<dependencyManagement> <dependencies> <dependency> <groupId>com.azure</groupId> <artifactId>azure-sdk-bom</artifactId> <version>1.0.6</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
Um Azure Storage SDK für Java zum Projekt hinzuzufügen, fügen Sie den folgenden
dependency
-Abschnitt unter dem xml-Tagproject/dependencies
hinzu.<dependency> <groupId>com.azure</groupId> <artifactId>azure-storage-blob</artifactId> </dependency>
Konfigurieren
Die erforderlichen Konfigurationswerte sind die Verbindungszeichenfolge für das Speicherkonto und der Name des Containers, den die App zum Speichern von Dateien verwendet. In diesem Modul führen Sie die App nur in Azure App Service aus. Folgen Sie der bewährten Methode von App Service und speichern Sie die Werte in den App Service-Einstellungen. Das tun Sie, wenn wir die App Service-Instanz erstellen. Im Moment brauchen Sie nichts zu tun.
Bei der Verwendung der Konfiguration werden die App Service-App-Einstellungen als Umgebungsvariablen an den Anwendungscode übergeben. Sie lesen sie im Initialisierungscode.
Initialize
Öffnen Sie im Editor src/main/java/com/microsoft/azure/samples/service/BlobStorage.java. Fügen Sie am Anfang der Datei die folgenden
import
-Anweisungen hinzu, um sie auf den Code vorzubereiten, den Sie hinzufügen werden.import java.util.stream.Collectors; import com.azure.storage.blob.BlobClient; import com.azure.storage.blob.BlobContainerClient; import com.azure.storage.blob.BlobServiceClient; import com.azure.storage.blob.BlobServiceClientBuilder; import com.azure.storage.blob.models.BlobItem;
Fügen Sie der Klasse
BlobStorage
eine Klasseneigenschaft für denBlobContainerClient
-Verweis hinzu.private BlobContainerClient blobContainerClient;
Tipp
Azure-Clients sind zustandslos und threadsicher. Es wird empfohlen, ihre Instanzen ggf. zwischenzuspeichern. Beispielsweise verwendet die App, an der Sie arbeiten, einen einzelnen Container mit gleichbleibendem Namen. Daher ist es am besten, ihn für die Lebensdauer der App zwischenzuspeichern.
BlobStorage
ist mit@Singleton
kommentiert. Deshalb wird empfohlen, den VerweisBlobContainerClient
im zugehörigen Feld zu speichern.Suchen Sie die
init
-Methode mit der Anmerkung@PostConstruct
. Ihre Anwendung ruft diese Methode auf, nachdem dieBlobStorage
-Instanz erstellt wurde und bevor sie zum ersten Mal verwendet wird.Unter
init
erstellen Sie den Container, falls noch keiner vorhanden ist. Ersetzen Sie die aktuelle Implementierung voninit
durch den folgenden Code, und speichern Sie Ihre Arbeit:@PostConstruct private void init() { String connectionString = System.getenv("STORAGE_CONNECTION_STRING"); String containerName = System.getenv("STORAGE_CONTAINER_NAME"); BlobServiceClient blobServiceClient = new BlobServiceClientBuilder() .connectionString(connectionString) .buildClient(); blobContainerClient = blobServiceClient.getBlobContainerClient(containerName); if (!blobContainerClient.exists()) { blobContainerClient.create(); } }