Esercizio - Configurare e inizializzare la libreria client

Completato

Di seguito è riportato il flusso di lavoro tipico per le app che usano l'archiviazione BLOB di Azure:

  1. Recuperare la configurazione: all'avvio, caricare la configurazione dell'account di archiviazione, in genere una stringa di connessione dell'account.

  2. 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.

  3. 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:

  1. Creare un'istanza di un nuovo oggetto BlobServiceClient e fornire la stringa di connessione all'account di archiviazione.

  2. Per ottenere un BlobContainerClient, chiamare GetBlobContainerClient su BlobServiceClient 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:

  1. Creare BlobServiceClient istanziando un nuovo oggetto BlobServiceClientBuilder tramite la stringa di connessione all'account di archiviazione.

  2. Per ottenere un BlobContainerClient, chiamare il metodo getBlobContainerClient su BlobServiceClient 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

  1. 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 .
    
  2. 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 denominata storage per l'esecuzione delle operazioni. È disponibile un'implementazione incompleta di IStorage in Models/BlobStorage.cs da compilare.

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

  1. 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;
    
  2. Individuare il metodo Initialize. L'app chiama questo metodo quando usa BlobStorage per la prima volta. Per curiosità, è possibile esaminare ConfigureServices 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 di Initialize 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

  1. 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 .
    
  2. 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 denominata storage per l'esecuzione delle operazioni. È disponibile un'implementazione incompleta di Storage 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.

  1. Nell'editor aprire il file pom.xml.

  2. Per aggiungere Azure BOM al progetto, aggiungere la sezione dependencyManagement seguente sotto il tag xml project.

    <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>
    
  3. Per aggiungere Archiviazione di Azure SDK per Java, aggiungere la dipendenza dependency seguente alla sezione xml project/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

  1. 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;
    
  2. Aggiungere una proprietà di classe nella classe BlobStorage per contenere il riferimento BlobContainerClient.

    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 riferimento BlobContainerClient nel relativo campo.

  3. Individuare il metodo init con l'annotazione @PostConstruct. L'app chiama questo metodo dopo la creazione dell'istanza BlobStorage e prima che venga usata per la prima volta.

    init è la posizione in creare il contenitore se non esiste già. Sostituire l'implementazione corrente di init 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();
        }
    }