教學課程:在 .NET 中使用 Azure 佇列儲存體佇列

Azure 佇列儲存體可實作雲端式佇列,使分散式應用程式的元件之間可進行通訊。 每個佇列都會維護一份可由傳送端元件新增、且可由接收端元件處理的訊息清單。 透過佇列,您的應用程式將可立即進行調整以因應需求。 本文說明使用 Azure 佇列儲存體佇列的基本步驟。

在本教學課程中,您會了解如何:

  • 建立 Azure 儲存體帳戶
  • 建立 應用程式
  • 新增 Azure 用戶端程式庫
  • 新增非同步程式碼的支援
  • 建立佇列
  • 將訊息插入佇列中
  • 清除佇列中的訊息
  • 刪除空的佇列
  • 檢查命令列引數
  • 建置並執行應用程式

必要條件

建立 Azure 儲存體帳戶

  1. 首先,請建立 Azure 儲存體帳戶。

    如需建立儲存體帳戶的逐步指南,請參閱建立儲存體帳戶。 這是您在必要條件中建立免費的 Azure 帳戶之後所執行的個別步驟。

  2. 請確定您的使用者帳戶已獲指派記憶體 佇列數據參與者 角色,範圍設定為記憶體帳戶、父資源群組或訂用帳戶。 請參閱 向 Azure 驗證。

建立 應用程式

建立名為 QueueApp 的 .NET Core 應用程式。 為了方便說明,此應用程式將可透過佇列傳送和接收訊息。

  1. 在主控台視窗中 (例如 CMD、PowerShell 或 Azure CLI),使用 dotnet new 命令建立名為 QueueApp 的新主控台應用程式。 此命令會建立簡單的 "hello world" C# 專案,內含名為 Program.cs 的單一來源檔案。

    dotnet new console -n QueueApp
    
  2. 切換至新建立的 QueueApp 資料夾,然後建置應用程式來確認一切正常。

    cd QueueApp
    
    dotnet build
    

    您應該會看到類似下面輸出的結果:

    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>_
    

新增 Azure 用戶端程式庫

  1. 使用 dotnet add package 命令,將 Azure 儲存體用戶端程式庫新增至專案。

    從主控台視窗中的專案資料夾執行下列命令。

    dotnet add package Azure.Storage.Queues
    

新增 using 陳述式

  1. 從專案目錄中的命令列輸入 code .,以在目前的目錄中開啟 Visual Studio Code。 將命令列視窗保持開啟。 稍後將會執行更多命令。 如果系統提示您新增建置和偵錯所需的 C# 資產,請按一下 [是] 按鈕。

  2. 開啟 Program.cs 來源檔案,並緊接在 using System; 陳述式後面新增下列命名空間。 此應用程式會使用這些命名空間中的類型連線至 Azure 儲存體,並使用佇列。

    using System.Threading.Tasks;
    using Azure.Storage.Queues;
    using Azure.Storage.Queues.Models;
    
  3. 儲存Program.cs檔案。

新增非同步程式碼的支援

由於應用程式使用雲端資源,因此程式碼會以非同步方式執行。

  1. 更新 Main 方法,以非同步方式執行。 將 void 取代為 async Task 傳回值。

    static async Task Main(string[] args)
    
  2. 儲存Program.cs檔案。

建立佇列

在對 Azure API 進行任何呼叫之前,您必須確定您已使用您指派角色的相同Microsoft Entra 帳戶進行驗證。 驗證之後,您可以使用 來存取記憶體帳戶中的佇列數據,來建立和授權 QueueClient 物件 DefaultAzureCredential 。 DefaultAzureCredential 會自動探索並使用您登入的帳戶。 若要瞭解如何登入,然後建立 QueueClient 物件,請參閱 授權存取權及建立客戶端物件。

將訊息插入佇列中

建立將訊息傳送至佇列中的新方法。

  1. 將下列 InsertMessageAsync 方法新增至您的 Program 類別。

    已傳遞佇列參考給這個方法。 藉由呼叫 CreateIfNotExistsAsync,建立新的佇列 (如果尚未存在)。 然後該佇列會呼叫 newMessage,將 SendMessageAsync 新增至佇列。

    static async Task InsertMessageAsync(QueueClient theQueue, string newMessage)
    {
        if (null != await theQueue.CreateIfNotExistsAsync())
        {
            Console.WriteLine("The queue was created.");
        }
    
        await theQueue.SendMessageAsync(newMessage);
    }
    
  2. 選擇性: 根據預設,訊息的存留時間上限會設為 7 天。 您可以指定任何正數的訊息存留時間。 下列程式碼片段會新增「永不」過期的訊息。

    若要新增不會過期的訊息,請在 Timespan.FromSeconds(-1) 的呼叫中使用 SendMessageAsync。

    await theQueue.SendMessageAsync(newMessage, default, TimeSpan.FromSeconds(-1), default);
    
  3. 儲存檔案。

佇列訊息的格式必須與使用 UTF-8 編碼的 XML 要求相容。 一則訊息的大小可能高達 64 KB。 如果訊息包含二進位資料,則將訊息編碼為 Base64。

清除佇列中的訊息

建立新方法已從佇列中擷取訊息。 在成功接收訊息後,務必要從佇列中刪除該訊息,以免受到多次處理。

  1. 將稱為 RetrieveNextMessageAsync 的新方法新增至您的 Program 類別。

    此方法會藉由呼叫 ReceiveMessagesAsync,在第一個參數中傳遞 1 僅擷取佇列中的下一則訊息,以接收佇列中的訊息。 收到訊息後,請呼叫 DeleteMessageAsync 以從佇列中刪除該訊息。

    當使用 v12 之前的 SDK 版本將訊息傳送至佇列時,會自動以 Base64 編碼。 從 v12 開始,已移除該功能。 使用 v12 SDK 來擷取訊息時,不會自動進行 Base64 解碼。 您必須自行明確地對內容進行 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. 儲存檔案。

刪除空的佇列

在專案結束後確認您是否還需要您建立的資源,是最佳做法。 資源若繼續執行,將需付費。 如果佇列存在,但是空的,請詢問使用者是否要加以刪除。

  1. 展開 RetrieveNextMessageAsync 方法,以納入刪除空佇列的提示。

    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. 儲存檔案。

檢查命令列引數

如果在應用程式中傳入了任何命令列引數,請假設它們是要新增至佇列的訊息。 引數聯結在一起,組成字串。 藉由呼叫我們先前新增的 InsertMessageAsync 方法,將此字串新增至訊息佇列。

如果沒有任何命令列引數,請嘗試擷取作業。 呼叫 RetrieveNextMessageAsync 方以擷取佇列中的下一則訊息。

最後,等到使用者輸入後,再呼叫 Console.ReadLine 結束。

  1. 展開 Main 方法以檢查命令列引數,並等候使用者輸入。 在下列代碼段中,請務必將 {storageAccountName} 佔位元取代為您的記憶體帳戶名稱。

    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. 儲存檔案。

完整程式碼

以下列出此專案的完整程式碼。

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

建置並執行應用程式

  1. 從專案目錄中的命令列執行下列 dotnet 命令,以建置專案。

    dotnet build
    
  2. 專案成功建置後,請執行下列命令,將第一個訊息新增至佇列。

    dotnet run First queue message
    

    您應該會看見下列輸出:

    C:\Tutorials\QueueApp>dotnet run First queue message
    The queue was created.
    Sent: First queue message
    Press Enter..._
    
  3. 執行未使用命令列引數的應用程式,以接收和移除佇列中的第一個訊息。

    dotnet run
    
  4. 繼續執行應用程式,直到所有訊息皆移除。 如果您再執行一次,應該會出現佇列空白的訊息,以及刪除佇列的提示。

    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>_
    

下一步

在本教學課程中,您已了解如何:

  1. 建立佇列
  2. 從佇列新增和移除訊息
  3. 刪除 Azure 佇列儲存體佇列

如需詳細資訊,請參閱 Azure 佇列儲存體快速入門。

如需使用已淘汰 .NET 11.x 版 SDK 的相關程式碼範例,請參閱使用 .NET 11.x 版的程式碼範例。