Delen via


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
  • Ontwikkel de app en voer deze uit

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

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

  2. Zorg ervoor dat aan uw gebruikersaccount de rol Inzender voor opslagwachtrijgegevens is toegewezen, die is afgestemd op het opslagaccount, de bovenliggende resourcegroep of het abonnement. Zie Verifiëren bij Azure.

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 QueueApp-map en bouw de app om te controleren of alles goed 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 Program.cs bronbestand en voeg de volgende naamruimten toe direct na de using System; instructie. 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 Main methode bij om asynchroon uit te voeren. Vervang door void een async Task retourwaarde.

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

Een wachtrij maken

Voordat u aanroepen naar Azure-API's uitvoert, moet u ervoor zorgen dat u bent geverifieerd met hetzelfde Microsoft Entra-account waaraan u de rol hebt toegewezen. Nadat u bent geverifieerd, kunt u een QueueClient object maken en autoriseren met behulp van DefaultAzureCredential toegang tot wachtrijgegevens in het opslagaccount. DefaultAzureCredential detecteert en gebruikt automatisch het account waarin u zich hebt aangemeld. Zie Toegang autoriseren en een clientobject maken voor meer informatie over aanmelden en vervolgens een QueueClient object maken.

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: de maximale time-to-live voor een bericht is standaard 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 Timespan.FromSeconds(-1) u 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 toe die aan uw klas wordt aangeroepen RetrieveNextMessageAsync 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 RetrieveNextMessageAsync methode uit om een prompt op te nemen om de lege wachtrij te verwijderen.

    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 InsertMessageAsync methode aan te roepen die we eerder hebben toegevoegd.

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

Wacht tot slot op gebruikersinvoer voordat u afsluit door aan te roepen Console.ReadLine.

  1. Vouw de Main methode uit om te controleren op opdrachtregelargumenten en wacht op gebruikersinvoer. Zorg ervoor dat u in het onderstaande codefragment de {storageAccountName} tijdelijke aanduiding vervangt door de naam van uw opslagaccount.

    static async Task Main(string[] args)
    {
       QueueClient queue = new QueueClient(
          new Uri($"https://{storageAccountName}.queue.core.windows.net/mystoragequeue"),
          new DefaultAzureCredential());
    
       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;
using Azure.Identity;

namespace QueueApp
{
    class Program
    {
        static async Task Main(string[] args)
        {
            QueueClient queue = new QueueClient(
               new Uri($"https://{storageAccountName}.queue.core.windows.net/mystoragequeue"),
               new DefaultAzureCredential());

            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.";
            }
        }
    }
}

Ontwikkel de app en voer deze uit

  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
    

    De uitvoer moet er ongeveer als volgt uitzien:

    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 .NET-versie 11.x.