Condividi tramite


Avvio rapido: Inviare e ricevere messaggi da una coda del Bus di servizio di Azure (.NET)

In questo avvio rapido si eseguiranno le operazioni seguenti:

  1. Creare uno spazio dei nomi del bus di servizio usando il portale di Azure.

  2. Creare una coda del bus di servizio usando il portale di Azure.

  3. Scrivere un'applicazione console .NET per inviare un set di messaggi alla coda.

  4. Scrivere un'applicazione console .NET per ricevere tali messaggi dalla coda.

    Nota

    Questa guida introduttiva fornisce istruzioni dettagliate per implementare uno scenario semplice di invio di un batch di messaggi a una coda di Bus di servizio quindi riceverli. Per una panoramica della libreria client .NET, vedere Libreria client di Bus di servizio di Azure per .NET. Per altri esempi, vedere Esempi di Bus di servizio .NET in GitHub.

Prerequisiti

Se non si ha familiarità con il servizio, vedere Panoramica di Bus di servizio prima di seguire questo avvio rapido.

  • Sottoscrizione di Azure. Per usare i servizi di Azure, tra cui Bus di servizio di Azure, è necessaria una sottoscrizione. Se non si ha un account Azure esistente, è possibile iscriversi per ottenere una versione di valutazione gratuita.
  • Visual Studio 2022. L'applicazione di esempio usa nuove funzionalità introdotte in C# 10. È comunque possibile usare la libreria client di Bus di servizio con le versioni precedenti del linguaggio C#, ma la sintassi potrebbe variare. Per usare la sintassi più recente, è consigliabile installare .NET 6.0 o versione successiva e impostare la versione del linguaggio su latest. Se si usa Visual Studio, le versioni precedenti a Visual Studio 2022 non sono compatibili con gli strumenti necessari per la compilazione di progetti in C# 10.

Creare uno spazio dei nomi nel portale di Azure

Per iniziare a usare le entità di messaggistica del bus di servizio in Azure, prima di tutto è necessario creare uno spazio dei nomi con un nome univoco in Azure. Uno spazio dei nomi fornisce un contenitore di ambito per le risorse del Bus di servizio (code, argomenti, ecc.) all'interno dell'applicazione.

Per creare uno spazio dei nomi:

  1. Accedere al portale di Azure.

  2. Andare alla pagina Tutti i servizi.

  3. Nella barra di spostamento a sinistra selezionare Integrazione nell'elenco delle categorie, passare il puntatore del mouse sul Bus di servizio quindi selezionare il pulsante + nel riquadro Bus di servizio.

    Immagine che mostra la selezione di Crea una risorsa, Integrazione quindi Bus di servizio nel menu.

  4. Nel tag Dati principali della pagina Crea spazio dei nomi seguire questa procedura:

    1. Per Sottoscrizione scegliere una sottoscrizione di Azure in cui creare lo spazio dei nomi.

    2. Per Gruppo di risorse scegliere un gruppo di risorse esistente in cui risiederà lo spazio dei nomi oppure crearne uno nuovo.

    3. Immettere un nome per lo spazio dei nomi. Il nome dello spazio dei nomi deve rispettare le seguenti convenzioni di denominazione:

      • Il nome deve essere univoco in Azure. Verrà effettuato immediatamente un controllo sulla disponibilità del nome.
      • La lunghezza del nome deve essere compresa tra 6 e 50 caratteri.
      • Il nome può contenere solo lettere, numeri e trattini "-".
      • Il nome deve iniziare con una lettera e terminare con una lettera o un numero.
      • Il nome non termina con "-sb" o "-mgmt".
    4. Per Localitàscegliere l'area in cui deve essere ospitato lo spazio dei nomi.

    5. In Piano tariffario, selezionare il piano tariffario (Basic, Standard o Premium) per lo spazio dei nomi. Per questo avvio rapido selezionare Standard.

      Importante

      Se si vogliono usare argomenti e sottoscrizioni, scegliere Standard o Premium. Argomenti e sottoscrizioni non sono supportati nel piano tariffario Basic.

      Se è stato selezionato il piano tariffario Premium, specificare il numero di unità di messaggistica. Il piano Premium fornisce l'isolamento delle risorse a livello di CPU e memoria in modo che ogni carico di lavoro venga eseguito in isolamento. Questo contenitore di risorse viene chiamato unità di messaggistica. Uno spazio dei nomi Premium ha almeno un'unità di messaggistica. È possibile acquistare 1, 2, 4, 8 o 16 unità di messaggistica per ogni spazio dei nomi Premium del Bus di servizio. Per altre informazioni, vedere Messaggistica Premium del bus di servizio.

    6. Selezionare Rivedi e crea nella parte inferiore della pagina.

      Immagine che mostra la pagina Creare uno spazio dei nomi

    7. Nella pagina Rivedi + crea controllare le impostazioni e selezionare Crea.

  5. Al termine della distribuzione della risorsa, selezionare Vai alla risorsa nella pagina di distribuzione.

    Immagine che mostra la pagina distribuzione riuscita con il link Vai alla risorsa.

  6. Viene visualizzata la home page dello spazio dei nomi del bus di servizio.

    Immagine che mostra la home page dello spazio dei nomi del Bus di servizio creato.

Creare una coda nel portale di Azure

  1. Nella pagina Spazio dei nomi del bus di servizio scegliere Code dal menu di spostamento a sinistra.

  2. Nella pagina Code selezionare + Coda sulla barra degli strumenti.

  3. Immettere un nome per la coda e lasciare le impostazioni predefinite per gli altri valori.

  4. Selezionare quindi Crea.

    Immagine che mostra la creazione di una coda nel portale

Importante

Se non si ha familiarità con Azure, l'opzione Stringa di connessione potrebbe essere più semplice da seguire. Selezionare la scheda Stringa di connessione per visualizzare le istruzioni sull'uso di una stringa di connessione in questo avvio rapido. È consigliabile usare l'opzione Senza password in applicazioni e ambienti di produzione reali.

Autenticare l'app in Azure

Questo avvio rapido illustra due modi per connettersi al Bus di servizio di Azure: senza password e stringa di connessione.

La prima opzione mostra come usare l'entità di sicurezza in Microsoft Entra ID e il controllo degli accessi in base al ruolo (RBAC) per connettersi a uno spazio dei nomi del Bus di servizio. Non è necessario preoccuparsi di avere una stringa di connessione hardcoded nel codice, in un file di configurazione o in un'archiviazione sicura come Azure Key Vault.

La seconda opzione mostra come usare una stringa di connessione per connettersi a uno spazio dei nomi del Bus di servizio. Se non si ha familiarità con Azure, è possibile trovare l'opzione della stringa di connessione più semplice da seguire. È consigliabile usare l'opzione senza password in applicazioni e ambienti di produzione reali. Per altre informazioni, consultare Autenticazione e autorizzazione. Per altre informazioni sull'autenticazione senza password, vedere la pagina di panoramica.

Assegnare ruoli all'utente di Microsoft Entra

Quando si sviluppa in locale, assicurarsi che l'account utente che si connette al Bus di servizio di Azure disponga delle autorizzazioni corrette. Per inviare e ricevere messaggi, è necessario il ruolo Proprietario dei dati del Bus di servizio di Azure. Per assegnare a se stessi questo ruolo, è necessario il ruolo Amministratore accesso utenti o un altro ruolo che include l'azione Microsoft.Authorization/roleAssignments/write. È possibile assegnare ruoli controllo degli accessi in base al ruolo di Azure a un utente usando il portale di Azure, l'interfaccia della riga di comando di Azure o Azure PowerShell. Altre informazioni sugli ambiti disponibili per le assegnazioni di ruolo sono disponibili nella pagina panoramica dell'ambito .

L'esempio seguente assegna il ruolo Azure Service Bus Data Owner all'account utente, che fornisce l'accesso completo alle risorse del Bus di servizio di Azure. In uno scenario reale, seguire il Principio dei privilegi minimi per concedere agli utenti solo le autorizzazioni minime necessarie per un ambiente di produzione più sicuro.

Ruoli predefiniti di Azure per il Bus di servizio di Azure

Per il Bus di servizio di Azure, la gestione degli spazi dei nomi e di tutte le risorse correlate tramite il portale di Azure e l'API Gestione risorse di Azure è già protetto mediante il modello RBAC di Azure. Azure fornisce i ruoli predefiniti di Azure seguenti per autorizzare l'accesso a uno spazio dei nomi del Bus di servizio:

Per creare un ruolo personalizzato, vedere Diritti necessari per le operazioni del Bus di servizio.

Aggiungere l'utente di Microsoft Entra al ruolo Proprietario del Bus di servizio di Azure

Aggiungere il nome utente di Microsoft Entra al ruolo Proprietario dei dati del Bus di servizio di Azure a livello di spazio dei nomi del Bus di servizio. Consentirà a un'app in esecuzione nel contesto dell'account utente di inviare messaggi a una coda o a un argomento e di ricevere messaggi da una coda o da una sottoscrizione di un argomento.

Importante

Nella maggior parte dei casi, la propagazione dell'assegnazione di ruolo in Azure richiederà almeno due minuti. In rari casi, possono essere necessari fino a otto minuti. Se si ricevono errori di autenticazione quando si esegue il codice per la prima volta, attendere alcuni istanti e riprovare.

  1. Se la pagina Spazio dei nomi del Bus di servizio non è aperta nel portale di Azure, individuare lo spazio dei nomi del Bus di servizio usando la barra di ricerca principale o lo spostamento a sinistra.

  2. Nella pagina di panoramica selezionare Controllo di accesso (IAM) nel menu a sinistra.

  3. Nella pagina Controllo di accesso (IAM), selezionare la scheda Assegnazioni di ruolo.

  4. Selezionare + Aggiungi dal menu in alto e quindi Aggiungi assegnazione di ruolo dal menu a discesa risultante.

    Screenshot che mostra come assegnare un ruolo.

  5. Usare la casella di ricerca per filtrare i risultati in base al ruolo desiderato. Per questo esempio, cercare Azure Service Bus Data Owner e selezionare il risultato corrispondente. Scegliere quindi Avanti.

  6. In Assegna accesso a selezionare Utente, gruppo o entità servizio e quindi scegliere + Seleziona membri.

  7. Nella finestra di dialogo cercare il nome utente di Microsoft Entra (in genere l'indirizzo di posta elettronica user@domain) e quindi scegliere Selezionare nella parte inferiore della finestra di dialogo.

  8. Selezionare Rivedi e assegna per passare alla pagina finale e quindi Rivedi e assegna di nuovo per completare il processo.

Avviare Visual Studio e accedere ad Azure

È possibile autorizzare l'accesso allo spazio dei nomi del Bus di servizio seguendo questa procedura:

  1. Avviare Visual Studio. Se viene visualizzata la finestra Attività iniziali, selezionare il collegamento Continua senza codice nel riquadro destro.

  2. Selezionare il pulsante Accedi in alto a destra in Visual Studio.

    Screenshot che mostra un pulsante per accedere ad Azure con Visual Studio.

  3. Accedere usando l'account Microsoft Entra a cui è stato assegnato un ruolo in precedenza.

    Screenshot che mostra la selezione dell’account.

Inviare messaggi alla coda

Questa sezione illustra come creare un'applicazione console .NET per inviare messaggi a una coda Bus di servizio.

Nota

Questa guida introduttiva fornisce istruzioni dettagliate per implementare uno scenario semplice di invio di un batch di messaggi a una coda di Bus di servizio quindi riceverli. Per altri esempi su altri scenari e avanzati, vedere Esempi di .NET di Bus di servizio in GitHub.

Creare un'applicazione console

  1. In Visual Studio selezionare il menu File ->Nuovo ->Progetto.

  2. Nella finestra di dialogo Crea un nuovo progetto seguire questa procedura: se non viene visualizzata questa finestra di dialogo, selezionare File dal menu, selezionare Nuovoe quindi selezionare Progetto.

    1. Selezionare C# come linguaggio di programmazione.

    2. Selezionare Console come tipo di applicazione.

    3. Selezionare App console nell'elenco risultati.

    4. Quindi seleziona Avanti.

      Immagine che mostra la finestra di dialogo Crea un nuovo progetto con C# e Console selezionati

  3. Immettere QueueSender come nome del progetto, ServiceBusQueueQuickStart per il nome della soluzione quindi selezionare Avanti.

    Immagine che mostra i nomi di soluzioni e progetti nella finestra di dialogo Configura il nuovo progetto

  4. Nella pagina Informazioni aggiuntive selezionare Crea per creare la soluzione e il progetto.

Aggiungere i pacchetti NuGet al progetto

  1. Scegliere Strumenti>Gestione pacchetti NuGet>Console di Gestione pacchetti dal menu.

  2. Eseguire il comando seguente per installare il pacchetto NuGet Azure.Messaging.ServiceBu.

    Install-Package Azure.Messaging.ServiceBus
    
  3. Eseguire il comando seguente per installare il pacchetto NuGet Azure.Identity.

    Install-Package Azure.Identity
    

Aggiungere il codice per inviare messaggi alla coda

  1. Sostituire il contenuto di Program.cs con il codice seguente. I passaggi importanti sono descritti nella sezione seguente, con informazioni aggiuntive nei commenti del codice.

    Importante

    Aggiornare i valori segnaposto (<NAMESPACE-NAME> e <QUEUE-NAME>) nel frammento di codice con i nomi dello spazio dei nomi e della coda del Bus di servizio.

    using Azure.Messaging.ServiceBus;
    using Azure.Identity;
    
    // name of your Service Bus queue
    // the client that owns the connection and can be used to create senders and receivers
    ServiceBusClient client;
    
    // the sender used to publish messages to the queue
    ServiceBusSender sender;
    
    // number of messages to be sent to the queue
    const int numOfMessages = 3;
    
    // The Service Bus client types are safe to cache and use as a singleton for the lifetime
    // of the application, which is best practice when messages are being published or read
    // regularly.
    //
    // Set the transport type to AmqpWebSockets so that the ServiceBusClient uses the port 443. 
    // If you use the default AmqpTcp, ensure that ports 5671 and 5672 are open.
    var clientOptions = new ServiceBusClientOptions
    { 
        TransportType = ServiceBusTransportType.AmqpWebSockets
    };
    //TODO: Replace the "<NAMESPACE-NAME>" and "<QUEUE-NAME>" placeholders.
    client = new ServiceBusClient(
        "<NAMESPACE-NAME>.servicebus.windows.net",
        new DefaultAzureCredential(),
        clientOptions);
    sender = client.CreateSender("<QUEUE-NAME>");
    
    // create a batch 
    using ServiceBusMessageBatch messageBatch = await sender.CreateMessageBatchAsync();
    
    for (int i = 1; i <= numOfMessages; i++)
    {
        // try adding a message to the batch
        if (!messageBatch.TryAddMessage(new ServiceBusMessage($"Message {i}")))
        {
            // if it is too large for the batch
            throw new Exception($"The message {i} is too large to fit in the batch.");
        }
    }
    
    try
    {
        // Use the producer client to send the batch of messages to the Service Bus queue
        await sender.SendMessagesAsync(messageBatch);
        Console.WriteLine($"A batch of {numOfMessages} messages has been published to the queue.");
    }
    finally
    {
        // Calling DisposeAsync on client types is required to ensure that network
        // resources and other unmanaged objects are properly cleaned up.
        await sender.DisposeAsync();
        await client.DisposeAsync();
    }
    
    Console.WriteLine("Press any key to end the application");
    Console.ReadKey();
    
  2. Compilare il progetto e assicurarsi che non siano presenti errori.

  3. Eseguire il programma e attendere il messaggio di conferma.

    A batch of 3 messages has been published to the queue
    

    Importante

    Nella maggior parte dei casi, la propagazione dell'assegnazione di ruolo in Azure richiederà almeno due minuti. In rari casi, potrebbero essere necessari fino a otto minuti. Se si ricevono errori di autenticazione quando si esegue il codice per la prima volta, attendere alcuni istanti e riprovare.

  4. Nel portale di Azure seguire questa procedura:

    1. Passare allo spazio dei nomi del bus di servizio.

    2. Nella pagina Panoramica selezionare la coda nel riquadro centrale inferiore.

      Immagine che mostra la pagina Spazio dei nomi del Bus di servizio nel portale di Azure con la coda selezionata.

    3. Notare i valori presenti nella sezione Informazioni di base.

      Immagine che mostra il numero di messaggi ricevuti e le dimensioni della coda.

    Notare i valori seguenti:

    • Il valore di Numero di messaggi attivi per la coda è ora 3. Ogni volta che si esegue l'app mittente senza recuperare i messaggi, questo valore aumenta di 3.
    • Il valore delle dimensioni correnti della coda aumenta ogni volta che l'app aggiunge messaggi alla coda.
    • Nel grafico Messaggi della sezione Metriche in basso sono presenti tre messaggi in ingresso per la coda.

Ricevere messaggi dalla coda

In questa sezione viene creata un'applicazione console .NET che riceve messaggi dalla coda.

Nota

Questo avvio rapido fornisce istruzioni dettagliate per implementare uno scenario di invio di un batch di messaggi a una coda del Bus di servizio quindi di riceverli. Per altri esempi su altri scenari e avanzati, vedere Esempi di .NET di Bus di servizio in GitHub.

Creare un progetto per l'app ricevente

  1. Nella finestra Esplora soluzioni fare clic con il pulsante destro del mouse sulla soluzione ServiceBusQueueQuickStart, scegliere Aggiunti e selezionare Nuovo progetto.
  2. Selezionare Applicazione console e selezionare Avanti.
  3. Immettere QueueReceiver per Nome progetto e selezionare Crea.
  4. Nella finestra Esplora soluzioni, fare clic con il pulsante destro del mouse su QueueReceiver e scegliere Imposta come progetto di avvio.

Aggiungere i pacchetti NuGet al progetto

  1. Scegliere Strumenti>Gestione pacchetti NuGet>Console di Gestione pacchetti dal menu.

  2. Selezionare QueueReceiver per Progetto predefinito.

    Screenshot che mostra il progetto QueueReceiver selezionato nella console di Gestione pacchetti.

  3. Eseguire il comando seguente per installare il pacchetto NuGet Azure.Messaging.ServiceBu.

    Install-Package Azure.Messaging.ServiceBus
    
  4. Eseguire il comando seguente per installare il pacchetto NuGet Azure.Identity.

    Install-Package Azure.Identity
    

Aggiungere il codice per ricevere messaggi dalla coda

In questa sezione si aggiunge il codice per recuperare i messaggi dalla coda.

  1. Nella classe Program aggiungere il codice:

    using System.Threading.Tasks;
    using Azure.Identity;
    using Azure.Messaging.ServiceBus;
    
    // the client that owns the connection and can be used to create senders and receivers
    ServiceBusClient client;
    
    // the processor that reads and processes messages from the queue
    ServiceBusProcessor processor;
    
  2. Aggiungere i metodi seguenti alla fine della classe Program.

    // handle received messages
    async Task MessageHandler(ProcessMessageEventArgs args)
    {
        string body = args.Message.Body.ToString();
        Console.WriteLine($"Received: {body}");
    
        // complete the message. message is deleted from the queue. 
        await args.CompleteMessageAsync(args.Message);
    }
    
    // handle any errors when receiving messages
    Task ErrorHandler(ProcessErrorEventArgs args)
    {
        Console.WriteLine(args.Exception.ToString());
        return Task.CompletedTask;
    }
    
  3. Aggiungere il codice seguente alla fine della classe Program. I passaggi importanti sono descritti nella sezione seguente, con informazioni aggiuntive nei commenti del codice.

    Importante

    Aggiornare i valori segnaposto (<NAMESPACE-NAME> e <QUEUE-NAME>) nel frammento di codice con i nomi dello spazio dei nomi e della coda del Bus di servizio.

    // The Service Bus client types are safe to cache and use as a singleton for the lifetime
    // of the application, which is best practice when messages are being published or read
    // regularly.
    //
    // Set the transport type to AmqpWebSockets so that the ServiceBusClient uses port 443. 
    // If you use the default AmqpTcp, make sure that ports 5671 and 5672 are open.
    
    // TODO: Replace the <NAMESPACE-NAME> placeholder
    var clientOptions = new ServiceBusClientOptions()
    {
        TransportType = ServiceBusTransportType.AmqpWebSockets
    };
    client = new ServiceBusClient(
        "<NAMESPACE-NAME>.servicebus.windows.net",
        new DefaultAzureCredential(),
        clientOptions);
    
    // create a processor that we can use to process the messages
    // TODO: Replace the <QUEUE-NAME> placeholder
    processor = client.CreateProcessor("<QUEUE-NAME>", new ServiceBusProcessorOptions());
    
    try
    {
        // add handler to process messages
        processor.ProcessMessageAsync += MessageHandler;
    
        // add handler to process any errors
        processor.ProcessErrorAsync += ErrorHandler;
    
        // start processing 
        await processor.StartProcessingAsync();
    
        Console.WriteLine("Wait for a minute and then press any key to end the processing");
        Console.ReadKey();
    
        // stop processing 
        Console.WriteLine("\nStopping the receiver...");
        await processor.StopProcessingAsync();
        Console.WriteLine("Stopped receiving messages");
    }
    finally
    {
        // Calling DisposeAsync on client types is required to ensure that network
        // resources and other unmanaged objects are properly cleaned up.
        await processor.DisposeAsync();
        await client.DisposeAsync();
    }
    
  4. La classe Program completata deve corrispondere al codice seguente:

    using System.Threading.Tasks;
    using Azure.Messaging.ServiceBus;
    using Azure.Identity;
    
    // the client that owns the connection and can be used to create senders and receivers
    ServiceBusClient client;
    
    // the processor that reads and processes messages from the queue
    ServiceBusProcessor processor;
    
    // The Service Bus client types are safe to cache and use as a singleton for the lifetime
    // of the application, which is best practice when messages are being published or read
    // regularly.
    //
    // Set the transport type to AmqpWebSockets so that the ServiceBusClient uses port 443.
    // If you use the default AmqpTcp, make sure that ports 5671 and 5672 are open.
    
    // TODO: Replace the <NAMESPACE-NAME> and <QUEUE-NAME> placeholders
    var clientOptions = new ServiceBusClientOptions() 
    {
        TransportType = ServiceBusTransportType.AmqpWebSockets
    };
    client = new ServiceBusClient("<NAMESPACE-NAME>.servicebus.windows.net", 
        new DefaultAzureCredential(), clientOptions);
    
    // create a processor that we can use to process the messages
    // TODO: Replace the <QUEUE-NAME> placeholder
    processor = client.CreateProcessor("<QUEUE-NAME>", new ServiceBusProcessorOptions());
    
    try
    {
        // add handler to process messages
        processor.ProcessMessageAsync += MessageHandler;
    
        // add handler to process any errors
        processor.ProcessErrorAsync += ErrorHandler;
    
        // start processing 
        await processor.StartProcessingAsync();
    
        Console.WriteLine("Wait for a minute and then press any key to end the processing");
        Console.ReadKey();
    
        // stop processing 
        Console.WriteLine("\nStopping the receiver...");
        await processor.StopProcessingAsync();
        Console.WriteLine("Stopped receiving messages");
    }
    finally
    {
        // Calling DisposeAsync on client types is required to ensure that network
        // resources and other unmanaged objects are properly cleaned up.
        await processor.DisposeAsync();
        await client.DisposeAsync();
    }
    
    // handle received messages
    async Task MessageHandler(ProcessMessageEventArgs args)
    {
        string body = args.Message.Body.ToString();
        Console.WriteLine($"Received: {body}");
    
        // complete the message. message is deleted from the queue. 
        await args.CompleteMessageAsync(args.Message);
    }
    
    // handle any errors when receiving messages
    Task ErrorHandler(ProcessErrorEventArgs args)
    {
        Console.WriteLine(args.Exception.ToString());
        return Task.CompletedTask;
    }
    
  5. Compilare il progetto e assicurarsi che non siano presenti errori.

  6. Eseguire l'applicazione ricevente. Verranno visualizzati i messaggi ricevuti. Premere un tasto qualsiasi per arrestare il destinatario e l'applicazione.

    Wait for a minute and then press any key to end the processing
    Received: Message 1
    Received: Message 2
    Received: Message 3
    
    Stopping the receiver...
    Stopped receiving messages
    
  7. Controllare di nuovo il portale. Attendere alcuni minuti e aggiornare la pagina se non vengono visualizzati 0 per i messaggi Attivi.

    • I valori di Numero di messaggi attivi e di Dimensioni correnti sono ora 0.

    • Nel grafico Messaggi della sezione Metriche in basso sono presenti tre messaggi in ingresso e tre in uscita per la coda.

      Screenshot che mostra i messaggi attivi e le dimensioni dopo la ricezione.

Pulire le risorse

Passare allo spazio dei nomi di Bus di servizio nel portale di Azure e selezionare Elimina nel portale di Azure per eliminare lo spazio dei nomi e la coda in esso contenuti.

Vedi anche

Vedere la documentazione e gli esempi seguenti:

Passaggi successivi