Esercizio - Configurare e inizializzare la libreria client
Di seguito è riportato il flusso di lavoro tipico per le app che usano l'archiviazione BLOB di Azure:
Recuperare la configurazione: all'avvio, caricare la configurazione dell'account di archiviazione, in genere una stringa di connessione dell'account.
Inizializzare il client: per inizializzare la libreria client di Archiviazione di Azure, usare la stringa di connessione. Con questa inizializzazione verranno creati gli oggetti che l'app usa per lavorare con l'API di archiviazione BLOB.
Usare: per operare su contenitori e BLOB, effettuare chiamate API usando la libreria client.
Configurare la stringa di connessione
Prima di eseguire l'app, ottenere la stringa di connessione per l'account di archiviazione usato. È possibile usare qualsiasi interfaccia di gestione di Azure, tra cui il portale di Azure, l'interfaccia della riga di comando di Azure e Azure PowerShell. Quando si configura l'app Web per eseguire il codice alla fine di questo modulo, si usa l'interfaccia della riga di comando di Azure per ottenere la stringa di connessione per l'account di archiviazione creato in precedenza.
Le stringhe di connessione dell'account di archiviazione includono la chiave dell'account. Considerare la chiave dell'account un segreto e archiviarla sempre in modo sicuro. In questo esempio, la stringa di connessione viene archiviata in un'impostazione dell'app del Servizio app. Le impostazioni dell'app del Servizio app sono una posizione sicura per i segreti dell'app. Questa progettazione non supporta lo sviluppo locale e non è una soluzione end-to-end affidabile da sola.
Importante
Questo esempio di codice usa una stringa di connessione per autorizzare l'accesso all'account di archiviazione. Questa configurazione è per scopi esemplificativi. Le stringhe di connessione e le chiavi di accesso dell'account devono essere usate con cautela nel codice dell'applicazione. Se la chiave di accesso dell'account va persa o viene accidentalmente inserita in una posizione non sicura, il servizio può diventare vulnerabile. Chiunque abbia la chiave di accesso può autorizzare richieste all'account di archiviazione e di fatto ha accesso a tutti i dati.
Per una sicurezza ottimale, Microsoft consiglia di usare Microsoft Entra ID con identità gestite per autorizzare le richieste nei dati BLOB, di code e tabelle, quando possibile. Per altre informazioni, vedere Autorizzare l'accesso ai BLOB usando Microsoft Entra ID.
Inizializzare il modello oggetto di archiviazione BLOB
Nell'SD di Archiviazione di Azure per .NET, il modello standard per l'uso dell'archiviazione BLOB prevede quanto segue:
Creare un'istanza di un nuovo oggetto
BlobServiceClient
e fornire la stringa di connessione all'account di archiviazione.Per ottenere un
BlobContainerClient
, chiamareGetBlobContainerClient
suBlobServiceClient
con il nome del contenitore con cui si vuole interagire o che si desidera creare.
Nel codice questi passaggi hanno un aspetto simile.
BlobServiceClient blobServiceClient = new BlobServiceClient(storageConfig.ConnectionString);
BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(storageConfig.FileContainerName);
Nessuno di tali codici di inizializzazione esegue le chiamate in rete. Ciò significa che alcune eccezioni che si verificano a causa di informazioni non corrette vengono generate solo in un momento successivo. Ad esempio, se al costruttore della classe BlobServiceClient
viene fornita una stringa di connessione formattata in modo errato, viene generata immediatamente un'eccezione. Tuttavia, se la stringa di connessione punta a un account di archiviazione che non esiste, non viene generata alcuna eccezione fino a quando non si tenta un'operazione sull'account di archiviazione.
Nell'SDK di Archiviazione di Azure per Java, il modello standard per l'uso dell'archiviazione BLOB prevede i passaggi seguenti:
Creare
BlobServiceClient
istanziando un nuovo oggettoBlobServiceClientBuilder
tramite la stringa di connessione all'account di archiviazione.Per ottenere un
BlobContainerClient
, chiamare il metodogetBlobContainerClient
suBlobServiceClient
con il nome del contenitore con cui si vuole interagire o che si desidera creare.
Nel codice questi passaggi hanno un aspetto simile.
BlobServiceClient blobServiceClient = BlobServiceClientBuilder()
.connectionString(connectionString)
.buildClient();
BlobContainerClient containerClient = blobServiceClient.getBlobContainerClient(containerName);
Nessuno di tali codici di inizializzazione esegue le chiamate in rete. Ciò significa che alcune eccezioni che si verificano a causa di informazioni non corrette vengono generate solo in un momento successivo. Ad esempio, se a BlobServiceClientBuilder
viene fornita una stringa di connessione formattata in modo errato, viene generata immediatamente un'eccezione. Tuttavia, se la stringa di connessione punta a un account di archiviazione che non esiste, non viene generata alcuna eccezione fino a quando non si tenta un'operazione sull'account di archiviazione.
Creare contenitori all'avvio
Per creare un contenitore all'avvio dell'app o quando l'app tenta di usarne uno per la prima volta, chiamare CreateIfNotExistsAsync
in un BlobContainerClient
.
CreateIfNotExistsAsync
non genera un'eccezione se il contenitore esiste già, ma esegue una chiamata di rete ad Archiviazione BLOB di Azure. La chiamata viene eseguita una volta durante l'inizializzazione, non ogni volta che si prova a usare un contenitore.
Per creare un contenitore all'avvio dell'app o al primo tentativo di utilizzo, chiamare exists
su BlobContainerClient
per verificare se esista già un contenitore. In caso negativo, chiamare create
. La chiamata viene eseguita una volta durante l'inizializzazione, non ogni volta che si prova a usare un contenitore.
Esercizio
Clonare ed esplorare l'app non completata
Prima di tutto, clonare l'app iniziale da GitHub. Nell'interfaccia della riga di comando di Azure Shell eseguire i comandi seguenti per ottenere una copia del codice sorgente e aprirla nell'editor:
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 .
Nell'editor aprire il file Controllers/FilesController.cs. Questo passaggio non prevede operazioni, ma consente di esaminare velocemente come funziona l'app.
Questo controller implementa un'API con tre azioni:
- Index: (
GET /api/Files
) restituisce un elenco di URL, uno per ogni file caricato. Il front-end di app chiama questo metodo per compilare un elenco di collegamenti ipertestuali nei file caricati. - Upload: (
POST /api/Files
) riceve un file caricato e lo salva. - Download: (
GET /api/Files/{filename}
) scarica un singolo file in base al nome.
Ogni metodo usa un'istanza
IStorage
denominatastorage
per l'esecuzione delle operazioni. È disponibile un'implementazione incompleta diIStorage
in Models/BlobStorage.cs da compilare.- Index: (
Aggiungere il pacchetto NuGet
Aggiungere un riferimento ad Azure Storage SDK. Eseguire i comandi seguenti nell'interfaccia della riga di comando di Azure Shell:
dotnet add package Azure.Storage.Blobs dotnet restore
Questo comando garantisce di usare la versione più recente della libreria client di Archiviazione BLOB.
Configurazione
I valori di configurazione necessari sono la stringa di connessione dell'account di archiviazione e il nome del contenitore usato dall'app per archiviare i file. In questo modulo, l'app verrà eseguita solo nel Servizio app di Azure. Seguire la procedura consigliata per Servizio app e archiviare i valori nelle impostazioni dell'app di Servizio app. Questa operazione deve essere eseguita quando si crea l'istanza di Servizio app. Non c'è niente da fare al momento.
Quando sarà il momento di usare la configurazione, l'app iniziale include già gli elementi di base necessari. Il parametro del costruttore IOptions<AzureStorageConfig>
in BlobStorage
ha due proprietà: la stringa di connessione dell'account di archiviazione e il nome del contenitore usato dall'app per archiviare i BLOB. Nel metodo ConfigureServices
di Startup.cs
è presente un codice che carica i valori dalla configurazione all'avvio dell'app.
Inizializzare
Nell'editor aprire Models/Blob BlobStorage.cs. Aggiungere le istruzioni
using
seguenti all'inizio del file per eseguire la preparazione per il codice che verrà aggiunto.using Azure; using Azure.Storage.Blobs; using Azure.Storage.Blobs.Models;
Individuare il metodo
Initialize
. L'app chiama questo metodo quando usaBlobStorage
per la prima volta. Per curiosità, è possibile esaminareConfigureServices
in Startup.cs per vedere come viene eseguita la chiamata.Initialize
è la posizione in cui si vuole creare il contenitore se non esiste ancora. Sostituire l'implementazione corrente diInitialize
con il codice seguente e salvare il lavoro premendoCTRL+S.public Task Initialize() { BlobServiceClient blobServiceClient = new BlobServiceClient(storageConfig.ConnectionString); BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(storageConfig.FileContainerName); return containerClient.CreateIfNotExistsAsync(); }
Clonare ed esplorare l'app non completata
Prima di tutto, clonare l'app iniziale da GitHub. Nell'interfaccia della riga di comando di Azure Shell eseguire i comandi seguenti per ottenere una copia del codice sorgente e aprirla nell'editor:
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 .
Nell'editor aprire il file src/main/java/com/microsoft/azure/samples/jsf/IndexBean.java. Questo passaggio non prevede operazioni, ma consente di esaminare velocemente come funziona l'app.
Questo bean con ambito richiesta implementa tre azioni usate dalla pagina src/main/webapp/index.xhtml JSF (Java Server Faces):
- listFileNames: restituisce un elenco di nomi file, uno per ogni file caricato. La pagina index.xhtml chiama questo metodo per compilare un elenco di collegamenti ipertestuali nei file caricati.
- upload: riceve un file caricato e lo salva. Il contenuto e i metadati del file vengono inseriti nella proprietà
uploadedFile
dal framework JSF. - download: scarica un singolo file in base al nome.
Ogni metodo usa un'istanza
Storage
denominatastorage
per l'esecuzione delle operazioni. È disponibile un'implementazione incompleta diStorage
in src/main/java/com/microsoft/azure/samples/service/BlobStorage.java da compilare.
Aggiungere le informazioni di riferimento sull'SDK di Archiviazione di Azure per Java
Si consiglia di usare Azure BOM per aggiungere librerie client di Azure al progetto. Offre un modo semplice ed elegante per orchestrare l'utilizzo di più librerie client di Azure garantendo al tempo stesso un numero minimo di conflitti di dipendenza.
Nell'editor aprire il file pom.xml.
Per aggiungere Azure BOM al progetto, aggiungere la sezione
dependencyManagement
seguente sotto il tag xmlproject
.<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>
Per aggiungere Archiviazione di Azure SDK per Java, aggiungere la dipendenza
dependency
seguente alla sezione xmlproject/dependencies
.<dependency> <groupId>com.azure</groupId> <artifactId>azure-storage-blob</artifactId> </dependency>
Configurazione
I valori di configurazione necessari sono la stringa di connessione dell'account di archiviazione e il nome del contenitore usato dall'app per archiviare i file. In questo modulo, l'app verrà eseguita solo nel Servizio app di Azure. Seguire la procedura consigliata per Servizio app e archiviare i valori nelle impostazioni dell'app di Servizio app. Questa operazione deve essere eseguita quando si crea l'istanza di Servizio app. Non c'è niente da fare al momento.
Quando si tratta di usare la configurazione, le impostazioni dell'app del servizio app vengono passate come variabili di ambiente al codice dell'app. Potranno essere letti nel codice di inizializzazione.
Inizializzare
Nell'editor aprire src/main/java/com/microsoft/azure/samples/service/BlobStorage.java. Aggiungere le istruzioni
import
seguenti all'inizio del file per eseguire la preparazione per il codice che verrà aggiunto.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;
Aggiungere una proprietà di classe nella classe
BlobStorage
per contenere il riferimentoBlobContainerClient
.private BlobContainerClient blobContainerClient;
Suggerimento
I client di Azure sono senza stato e thread-safe. È consigliabile memorizzare nella cache le istanze nei casi applicabili. Ad esempio, l'app su cui si sta lavorando usa un singolo contenitore con un nome costante, pertanto è consigliabile memorizzarla nella cache nell'ambito della durata dell'app.
BlobStorage
viene annotato con@Singleton
, pertanto è consigliabile archiviare il riferimentoBlobContainerClient
nel relativo campo.Individuare il metodo
init
con l'annotazione@PostConstruct
. L'app chiama questo metodo dopo la creazione dell'istanzaBlobStorage
e prima che venga usata per la prima volta.init
è la posizione in creare il contenitore se non esiste già. Sostituire l'implementazione corrente diinit
con il codice seguente e salvare il lavoro.@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(); } }