Zelfstudie: Werken met Azure Queue Storage-wachtrijen in .NET

Met Azure Queue Storage worden cloudwachtrijen geïmplementeerd om communicatie tussen onderdelen van een gedistribueerde toepassing mogelijk te maken. Elke wachtrij houdt een lijst bij van berichten die kunnen worden toegevoegd door een afzenderonderdeel en kunnen worden verwerkt door een ontvangeronderdeel. Met een wachtrij kan uw toepassing onmiddellijk worden geschaald om aan de vraag te voldoen. In dit artikel worden de basisstappen beschreven voor het werken met een Azure Queue Storage-wachtrij.

In deze zelfstudie leert u het volgende:

  • Een Azure Storage-account maken
  • De app maken
  • De Azure-clientbibliotheken toevoegen
  • Ondersteuning voor asynchrone code toevoegen
  • Een wachtrij maken
  • Berichten in een wachtrij invoegen
  • Bericht uit een wachtrij verwijderen
  • Een lege wachtrij verwijderen
  • Controleren op opdrachtregelargumenten
  • De app bouwen en uitvoeren

Vereisten

  • Download een gratis kopie van de Visual Studio Code-editor voor meerdere platforms.
  • Download en installeer de .NET Core SDK versie 3.1 of hoger.
  • Als u momenteel geen abonnement op Azure hebt, maakt u een gratis account voordat u begint.

Een Azure Storage-account maken

Maak eerst een Azure-opslagaccount. Raadpleeg Een opslagaccount maken voor een stapsgewijze handleiding voor het maken van een opslagaccount. Dit is een afzonderlijke stap die u uitvoert nadat u bij de vereisten een gratis Azure-account hebt gemaakt.

De app maken

Maak een .NET Core-toepassing met de naam QueueApp. Voor het gemak zal deze app zowel berichten verzenden als ontvangen via de wachtrij.

  1. Gebruik in een consolevenster (zoals cmd, PowerShell of Azure CLI) de opdracht dotnet new om een nieuwe console-app te maken met de naam QueueApp. Met deze opdracht maakt u een eenvoudig Hallo wereld-C#-project met één bronbestand genaamd: Program.cs.

    dotnet new console -n QueueApp
    
  2. Schakel over naar de zojuist gemaakt map QueueApp en bouw de app om te controleren of alles in orde is.

    cd QueueApp
    
    dotnet build
    

    U ziet als het goed is resultaten die vergelijkbaar zijn met de volgende uitvoer:

    C:\Tutorials>dotnet new console -n QueueApp
    The template "Console Application" was created successfully.
    
    Processing post-creation actions...
    Running 'dotnet restore' on QueueApp\QueueApp.csproj...
      Restore completed in 155.63 ms for C:\Tutorials\QueueApp\QueueApp.csproj.
    
    Restore succeeded.
    
    C:\Tutorials>cd QueueApp
    
    C:\Tutorials\QueueApp>dotnet build
    Microsoft (R) Build Engine version 16.0.450+ga8dc7f1d34 for .NET Core
    Copyright (C) Microsoft Corporation. All rights reserved.
    
      Restore completed in 40.87 ms for C:\Tutorials\QueueApp\QueueApp.csproj.
      QueueApp -> C:\Tutorials\QueueApp\bin\Debug\netcoreapp3.1\QueueApp.dll
    
    Build succeeded.
        0 Warning(s)
        0 Error(s)
    
    Time Elapsed 00:00:02.40
    
    C:\Tutorials\QueueApp>_
    

De Azure-clientbibliotheken toevoegen

  1. Voeg de Azure Storage-clientbibliotheken toe aan het project met behulp van de opdracht dotnet add package.

    Voer de volgende opdracht uit vanuit de projectmap in het consolevenster.

    dotnet add package Azure.Storage.Queues
    

Instructies toevoegen

  1. Ga naar de opdrachtregel in de projectmap en typ code . om Visual Studio Code in de huidige map te openen. Houd het opdrachtregelvenster geopend. U gaat later meer opdrachten uitvoeren. Als u wordt gevraagd om C#-assets toe te voegen die vereist zijn voor het maken en het opsporen van fouten, klikt u op de knop Ja.

  2. Open het bronbestand Program.cs en voeg de volgende naamruimten toe na de instructie using System;. Deze app gebruikt typen uit deze naamruimten om verbinding met Azure Storage te maken en met wachtrijen te werken.

    using System.Threading.Tasks;
    using Azure.Storage.Queues;
    using Azure.Storage.Queues.Models;
    
  3. Sla het bestand Program.cs op.

Ondersteuning voor asynchrone code toevoegen

Omdat de app gebruikmaakt van cloudresources, wordt de code asynchroon uitgevoerd.

  1. Werk de methode Main bij om asynchroon te worden uitgevoerd. Vervang void door een retourwaarde voor een async Task.

    static async Task Main(string[] args)
    
  2. Sla het bestand Program.cs op.

Een wachtrij maken

Voordat u aanroepen naar Azure API's kunt uitvoeren, moet u uw referenties ophalen uit de Azure-portal.

Kopieer uw referenties van de Azure Portal

Wanneer met de voorbeeldtoepassing een aanvraag wordt ingediend bij Azure Storage, moet deze aanvraag worden geautoriseerd. Om een aanvraag te autoriseren voegt u de referenties van uw opslagaccount toe als een verbindingsreeks. Voer de volgende stappen uit om de referenties van uw opslagaccount weer te geven:

  1. Meld u aan bij Azure Portal.

  2. Zoek uw opslagaccount.

  3. Selecteer in het menuvenster opslagaccount onder Beveiliging en netwerken de optie Toegangssleutels. Hier kunt u de toegangssleutels voor het account en de volledige connection string voor elke sleutel bekijken.

    Schermopname die laat zien waar de instellingen voor de toegangssleutel zich bevinden in de Azure Portal

  4. Selecteer in het deelvenster Toegangssleutelsde optie Sleutels weergeven.

  5. Zoek in de sectie key1 de waarde van de verbindingsreeks . Selecteer het pictogram Kopiëren naar klembord om de connection string te kopiëren. In de volgende sectie voegt u de connection string-waarde toe aan een omgevingsvariabele.

    Schermopname waarin een verbindingsreeks vanuit de Azure-portal wordt gekopieerd

De opslagverbindingsreeks configureren

Nadat u de connection string hebt gekopieerd, schrijft u deze naar een nieuwe omgevingsvariabele op de lokale computer waarop de toepassing wordt uitgevoerd. Als u de omgevingsvariabele wilt instellen, opent u een consolevenster en volgt u de aanwijzingen voor uw besturingssysteem. Vervang <yourconnectionstring> door de feitelijke verbindingsreeks.

setx AZURE_STORAGE_CONNECTION_STRING "<yourconnectionstring>"

Nadat u de omgevingsvariabele in Windows hebt toegevoegd, moet u een nieuw exemplaar van het opdrachtvenster starten.

Programma's opnieuw opstarten

Nadat u de omgevingsvariabele hebt toegevoegd, start u actieve programma's die de omgevingsvariabele moeten lezen, opnieuw. Start bijvoorbeeld uw ontwikkelomgeving of editor opnieuw voordat u doorgaat.

De verbindingsreeks aan de app toevoegen

Voeg de verbindingsreeks toe aan de app, zodat deze toegang krijgt tot het opslagaccount.

  1. Ga terug naar Visual Studio Code.

  2. Vervang in de methode Main de code Console.WriteLine("Hello, World"); door de volgende regel waarmee de verbindingstekenreeks wordt opgehaald uit de omgevingsvariabele.

    string connectionString = Environment.GetEnvironmentVariable("AZURE_STORAGE_CONNECTION_STRING");
    
  3. Voeg de volgende code toe aan Main om een wachtrij-object te maken, dat later wordt doorgegeven aan de methoden voor verzenden en ontvangen.

    QueueClient queue = new QueueClient(connectionString, "mystoragequeue");
    
  4. Sla het bestand op.

Berichten in de wachtrij invoegen

Maak een nieuwe methode om een bericht naar de wachtrij te verzenden.

  1. Voeg in volgende methode InsertMessageAsync toe aan de Program-klasse.

    Met deze methode wordt een wachtrijverwijzing doorgegeven. Er wordt een nieuwe wachtrij gemaakt, als deze nog niet bestaat, door CreateIfNotExistsAsync aan te roepen. Vervolgens wordt de newMessage toegevoegd aan de wachtrij door SendMessageAsync aan te roepen.

    static async Task InsertMessageAsync(QueueClient theQueue, string newMessage)
    {
        if (null != await theQueue.CreateIfNotExistsAsync())
        {
            Console.WriteLine("The queue was created.");
        }
    
        await theQueue.SendMessageAsync(newMessage);
    }
    
  2. Optioneel: Standaard is de maximale time-to-live voor een bericht ingesteld op zeven dagen. U kunt elk willekeurig positief getal opgeven voor de time-to-live van het bericht. Met het volgende codefragment wordt een bericht toegevoegd dat nooit verloopt.

    Als u een bericht wilt toevoegen dat niet verloopt, gebruikt u Timespan.FromSeconds(-1) in uw aanroep naar SendMessageAsync.

    await theQueue.SendMessageAsync(newMessage, default, TimeSpan.FromSeconds(-1), default);
    
  3. Sla het bestand op.

Een wachtrijbericht moet een indeling hebben die compatibel is met een XML-aanvraag met UTF-8-codering. Een bericht kan maximaal 64 KB groot zijn. Als een bericht binaire gegevens bevat, moet u het bericht base64-coderen.

Bericht uit een wachtrij verwijderen

Maak een nieuwe methode om een bericht uit de wachtrij op te halen. Zodra het bericht is ontvangen, is het belangrijk dat het uit de wachtrij wordt verwijderd zodat het niet meer dan één keer wordt verwerkt.

  1. Voeg een nieuwe methode met de naam RetrieveNextMessageAsync toe aan uw klasse Program.

    Met deze methode wordt een bericht uit de wachtrij ontvangen door het aanroepen van ReceiveMessagesAsync, waarbij 1 in de eerste parameter wordt doorgegeven om alleen het volgende bericht in de wachtrij op te halen. Nadat het bericht is ontvangen, verwijdert u het uit de wachtrij door DeleteMessageAsync aan te roepen.

    Wanneer een bericht wordt verzonden naar de wachtrij met een SDK-versie van vóór V12, wordt het automatisch met base64 gecodeerd. Vanaf V12 is deze functionaliteit verwijderd. Wanneer u een bericht ophaalt met behulp van SDK v12, wordt het niet automatisch met base64 gedecodeerd. U moet de inhoud zelf expliciet decoderen met base64.

    static async Task<string> RetrieveNextMessageAsync(QueueClient theQueue)
    {
        if (await theQueue.ExistsAsync())
        {
            QueueProperties properties = await theQueue.GetPropertiesAsync();
    
            if (properties.ApproximateMessagesCount > 0)
            {
                QueueMessage[] retrievedMessage = await theQueue.ReceiveMessagesAsync(1);
                string theMessage = retrievedMessage[0].Body.ToString();
                await theQueue.DeleteMessageAsync(retrievedMessage[0].MessageId, retrievedMessage[0].PopReceipt);
                return theMessage;
            }
    
            return null;
        }
    
        return null;
    }
    
  2. Sla het bestand op.

Een lege wachtrij verwijderen

Het is een best practice om aan het einde van een project te bepalen of u nog steeds de resources nodig hebt die u hebt gemaakt. Resources die actief blijven, kunnen u geld kosten. Als de wachtrij bestaat, maar leeg is, vraagt u de gebruiker of deze moet worden verwijderd.

  1. Vouw de methode RetrieveNextMessageAsync uit om een prompt op te nemen voor het verwijderen van de lege wachtrij.

    static async Task<string> RetrieveNextMessageAsync(QueueClient theQueue)
    {
        if (await theQueue.ExistsAsync())
        {
            QueueProperties properties = await theQueue.GetPropertiesAsync();
    
            if (properties.ApproximateMessagesCount > 0)
            {
                QueueMessage[] retrievedMessage = await theQueue.ReceiveMessagesAsync(1);
                string theMessage = retrievedMessage[0].Body.ToString();
                await theQueue.DeleteMessageAsync(retrievedMessage[0].MessageId, retrievedMessage[0].PopReceipt);
                return theMessage;
            }
            else
            {
                Console.Write("The queue is empty. Attempt to delete it? (Y/N) ");
                string response = Console.ReadLine();
    
                if (response.ToUpper() == "Y")
                {
                    await theQueue.DeleteIfExistsAsync();
                    return "The queue was deleted.";
                }
                else
                {
                    return "The queue was not deleted.";
                }
            }
        }
        else
        {
            return "The queue does not exist. Add a message to the command line to create the queue and store the message.";
        }
    }
    
  2. Sla het bestand op.

Controleren op opdrachtregelargumenten

Als er opdrachtregelargumenten worden doorgegeven aan de app, wordt ervan uitgegaan dat er een bericht wordt toegevoegd aan de wachtrij. Voeg de argumenten samen om een tekenreeks te maken. Voeg deze tekenreeks toe aan de berichtenwachtrij door de methode InsertMessageAsync aan te roepen die u eerder hebt toegevoegd.

Als er geen opdrachtregelargumenten zijn, probeert u een ophaalbewerking uit te voeren. Roep de methode RetrieveNextMessageAsync aan om het volgende bericht in de wachtrij op te halen.

Wacht ten slotte op invoer van de gebruiker voordat u afsluit met het aanroepen van Console.ReadLine.

  1. Vouw de methode Main uit om te controleren op opdrachtregelargumenten en te wachten op invoer van de gebruiker.

    static async Task Main(string[] args)
    {
        string connectionString = Environment.GetEnvironmentVariable("AZURE_STORAGE_CONNECTION_STRING");
    
        QueueClient queue = new QueueClient(connectionString, "mystoragequeue");
    
        if (args.Length > 0)
        {
            string value = String.Join(" ", args);
            await InsertMessageAsync(queue, value);
            Console.WriteLine($"Sent: {value}");
        }
        else
        {
            string value = await RetrieveNextMessageAsync(queue);
            Console.WriteLine($"Received: {value}");
        }
    
        Console.Write("Press Enter...");
        Console.ReadLine();
    }
    
  2. Sla het bestand op.

Volledige code

Dit is de volledige codelijst voor dit project.

using System;
using System.Threading.Tasks;
using Azure.Storage.Queues;
using Azure.Storage.Queues.Models;

namespace QueueApp
{
    class Program
    {
        static async Task Main(string[] args)
        {
            string connectionString = Environment.GetEnvironmentVariable("AZURE_STORAGE_CONNECTION_STRING");

            QueueClient queue = new QueueClient(connectionString, "mystoragequeue");

            if (args.Length > 0)
            {
                string value = String.Join(" ", args);
                await InsertMessageAsync(queue, value);
                Console.WriteLine($"Sent: {value}");
            }
            else
            {
                string value = await RetrieveNextMessageAsync(queue);
                Console.WriteLine($"Received: {value}");
            }

            Console.Write("Press Enter...");
            Console.ReadLine();
        }

        static async Task InsertMessageAsync(QueueClient theQueue, string newMessage)
        {
            if (null != await theQueue.CreateIfNotExistsAsync())
            {
                Console.WriteLine("The queue was created.");
            }

            await theQueue.SendMessageAsync(newMessage);
        }

        static async Task<string> RetrieveNextMessageAsync(QueueClient theQueue)
        {
            if (await theQueue.ExistsAsync())
            {
                QueueProperties properties = await theQueue.GetPropertiesAsync();

                if (properties.ApproximateMessagesCount > 0)
                {
                    QueueMessage[] retrievedMessage = await theQueue.ReceiveMessagesAsync(1);
                    string theMessage = retrievedMessage[0].Body.ToString();
                    await theQueue.DeleteMessageAsync(retrievedMessage[0].MessageId, retrievedMessage[0].PopReceipt);
                    return theMessage;
                }
                else
                {
                    Console.Write("The queue is empty. Attempt to delete it? (Y/N) ");
                    string response = Console.ReadLine();

                    if (response.ToUpper() == "Y")
                    {
                        await theQueue.DeleteIfExistsAsync();
                        return "The queue was deleted.";
                    }
                    else
                    {
                        return "The queue was not deleted.";
                    }
                }
            }
            else
            {
                return "The queue does not exist. Add a message to the command line to create the queue and store the message.";
            }
        }
    }
}

De app bouwen en uitvoeren

  1. Voer vanaf de opdrachtregel in de projectmap de volgende DotNet-opdracht uit om het project te bouwen.

    dotnet build
    
  2. Nadat het project is gebouwd, voert u de volgende opdracht uit om het eerste bericht toe te voegen aan de wachtrij.

    dotnet run First queue message
    

    U hoort deze uitvoer te zien:

    C:\Tutorials\QueueApp>dotnet run First queue message
    The queue was created.
    Sent: First queue message
    Press Enter..._
    
  3. Voer de app uit zonder opdrachtregelargumenten om het eerste bericht in de wachtrij te ontvangen en te verwijderen.

    dotnet run
    
  4. Ga door met het uitvoeren van de app totdat alle berichten zijn verwijderd. Als u de app nog een keer uitvoert, ontvangt u een bericht dat de wachtrij leeg is en wordt u gevraagd om de wachtrij te verwijderen.

    C:\Tutorials\QueueApp>dotnet run First queue message
    The queue was created.
    Sent: First queue message
    Press Enter...
    
    C:\Tutorials\QueueApp>dotnet run Second queue message
    Sent: Second queue message
    Press Enter...
    
    C:\Tutorials\QueueApp>dotnet run Third queue message
    Sent: Third queue message
    Press Enter...
    
    C:\Tutorials\QueueApp>dotnet run
    Received: First queue message
    Press Enter...
    
    C:\Tutorials\QueueApp>dotnet run
    Received: Second queue message
    Press Enter...
    
    C:\Tutorials\QueueApp>dotnet run
    Received: Third queue message
    Press Enter...
    
    C:\Tutorials\QueueApp>dotnet run
    The queue is empty. Attempt to delete it? (Y/N) Y
    Received: The queue was deleted.
    Press Enter...
    
    C:\Tutorials\QueueApp>_
    

Volgende stappen

In deze zelfstudie heeft u het volgende geleerd:

  1. Een wachtrij maken
  2. Berichten toevoegen aan en verwijderen uit een wachtrij
  3. Een Azure Queue Storage-wachtrij verwijderen

Bekijk de Azure Queue Storage-quickstarts voor meer informatie.

Zie Codevoorbeelden met .NET-versie 11.x voor gerelateerde codevoorbeelden met behulp van afgeschafte .NET versie 11.x SDK's.