Service Bus kuyrukları ile çalışmaya başlamaGet started with Service Bus queues

Bu öğreticide, bir Service Bus kuyruğundaki iletileri alıp ileti göndermek için .NET Core konsol uygulamaları oluşturun.In this tutorial, you create .NET Core console applications to send messages to and receive messages from a Service Bus queue.

ÖnkoşullarPrerequisites

  1. Visual Studio 2017 Güncelleştirme 3 (sürüm 15.3, 26730.01) veya sonraki sürümler.Visual Studio 2017 Update 3 (version 15.3, 26730.01) or later.
  2. NET Core SDK, sürüm 2.0 veya sonraki sürümler.NET Core SDK, version 2.0 or later.
  3. Azure aboneliği.An Azure subscription. Bu öğreticiyi tamamlamak için bir Azure hesabınızın olması gerekir.To complete this tutorial, you need an Azure account. Etkinleştirebilir, MSDN abone Avantajlarınızı veya kaydolun bir ücretsiz bir hesap.You can activate your MSDN subscriber benefits or sign up for a free account.
  4. Çalışmak için bir kuyruk yoksa, izleyeceğiniz adımlar Service Bus kuyruğuna oluşturmak için Azure portalını kullanın makalenin bir kuyruk oluşturun.If you don't have a queue to work with, follow steps in the Use Azure portal to create a Service Bus queue article to create a queue.
    1. Hızlı Okuma genel bakış Service Bus kuyrukları.Read the quick overview of Service Bus queues.
    2. Hizmet veri yolu oluşturma ad alanı.Create a Service Bus namespace.
    3. Alma bağlantı dizesi.Get the connection string.
    4. Hizmet veri yolu oluşturma kuyruk.Create a Service Bus queue.

Kuyruğa ileti göndermeSend messages to the queue

Kuyruğa ileti göndermek için, Visual Studio'yu kullanarak bir C# konsol uygulaması yazın.To send messages to the queue, write a C# console application using Visual Studio.

Konsol uygulaması oluşturmaCreate a console application

Visual Studio'yu başlatın ve yeni bir Konsol Uygulaması (.NET Core) projesi oluşturun.Launch Visual Studio and create a new Console App (.NET Core) project.

Service Bus NuGet paketi eklemeAdd the Service Bus NuGet package

  1. Yeni oluşturulan projeye sağ tıklayın ve NuGet Paketlerini Yönet’i seçin.Right-click the newly created project and select Manage NuGet Packages.

  2. Gözat sekmesine tıklayın, Microsoft.Azure.ServiceBus araması yapın ve ardından Microsoft.Azure.ServiceBus öğesini seçin.Click the Browse tab, search for Microsoft.Azure.ServiceBus, and then select the Microsoft.Azure.ServiceBus item. Yüklemeyi tamamlamak için Yükle'ye tıklayın, ardından bu iletişim kutusunu kapatın.Click Install to complete the installation, then close this dialog box.

    NuGet paketi seçme

Kuyruğa ileti göndermek için kod yazmaWrite code to send messages to the queue

  1. Program.cs’de, ad alanı tanımının üst kısmına, sınıf bildiriminden önce aşağıdaki using deyimlerini ekleyin:In Program.cs, add the following using statements at the top of the namespace definition, before the class declaration:

    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using Microsoft.Azure.ServiceBus;
    
  2. Program sınıfında, aşağıdaki değişkenleri bildirin.Within the Program class, declare the following variables. ServiceBusConnectionString değişkenini, ad alanını oluştururken elde ettiğiniz bağlantı dizesine, QueueName değerini ise kuyruğu oluştururken kullandığınız ada ayarlayın:Set the ServiceBusConnectionString variable to the connection string that you obtained when creating the namespace, and set QueueName to the name that you used when creating the queue:

    const string ServiceBusConnectionString = "<your_connection_string>";
    const string QueueName = "<your_queue_name>";
    static IQueueClient queueClient;
    
  3. Main() öğesinin varsayılan içeriklerini aşağıdaki kod satırıyla değiştirin:Replace the default contents of Main() with the following line of code:

    MainAsync().GetAwaiter().GetResult();
    
  4. Main() öğesinden hemen sonra, gönderme iletilerini metoda çağıran aşağıdaki zaman uyumsuz MainAsync() metodunu ekleyin:Directly after Main(), add the following asynchronous MainAsync() method that calls the send messages method:

    static async Task MainAsync()
    {
        const int numberOfMessages = 10;
        queueClient = new QueueClient(ServiceBusConnectionString, QueueName);
    
        Console.WriteLine("======================================================");
        Console.WriteLine("Press ENTER key to exit after sending all the messages.");
        Console.WriteLine("======================================================");
    
        // Send messages.
        await SendMessagesAsync(numberOfMessages);
    
        Console.ReadKey();
    
        await queueClient.CloseAsync();
    }
    
  5. MainAsync() metodundan hemen sonra, numberOfMessagesToSend tarafından belirlenen sayıda mesajı (geçerli değer: 10) gönderen aşağıdaki SendMessagesAsync() metodunu ekleyin:Directly after the MainAsync() method, add the following SendMessagesAsync() method that performs the work of sending the number of messages specified by numberOfMessagesToSend (currently set to 10):

    static async Task SendMessagesAsync(int numberOfMessagesToSend)
    {
        try
        {
            for (var i = 0; i < numberOfMessagesToSend; i++)
            {
                // Create a new message to send to the queue.
                string messageBody = $"Message {i}";
                var message = new Message(Encoding.UTF8.GetBytes(messageBody));
    
                // Write the body of the message to the console.
                Console.WriteLine($"Sending message: {messageBody}");
    
                // Send the message to the queue.
                await queueClient.SendAsync(message);
            }
        }
        catch (Exception exception)
        {
            Console.WriteLine($"{DateTime.Now} :: Exception: {exception.Message}");
        }
    }
    
  6. Program.cs dosyanızın şu biçimde olması gerekir:Here is what your Program.cs file should look like.

    namespace CoreSenderApp
    {
        using System;
        using System.Text;
        using System.Threading;
        using System.Threading.Tasks;
        using Microsoft.Azure.ServiceBus;
    
        class Program
        {
            // Connection String for the namespace can be obtained from the Azure portal under the 
            // 'Shared Access policies' section.
            const string ServiceBusConnectionString = "<your_connection_string>";
            const string QueueName = "<your_queue_name>";
            static IQueueClient queueClient;
    
            static void Main(string[] args)
            {
                MainAsync().GetAwaiter().GetResult();
            }
    
            static async Task MainAsync()
            {
                const int numberOfMessages = 10;
                queueClient = new QueueClient(ServiceBusConnectionString, QueueName);
    
                Console.WriteLine("======================================================");
                Console.WriteLine("Press ENTER key to exit after sending all the messages.");
                Console.WriteLine("======================================================");
    
                // Send Messages
                await SendMessagesAsync(numberOfMessages);
    
                Console.ReadKey();
    
                await queueClient.CloseAsync();
            }
    
            static async Task SendMessagesAsync(int numberOfMessagesToSend)
            {
                try
                {
                    for (var i = 0; i < numberOfMessagesToSend; i++)
                    {
                        // Create a new message to send to the queue
                        string messageBody = $"Message {i}";
                        var message = new Message(Encoding.UTF8.GetBytes(messageBody));
    
                        // Write the body of the message to the console
                        Console.WriteLine($"Sending message: {messageBody}");
    
                        // Send the message to the queue
                        await queueClient.SendAsync(message);
                    }
                }
                catch (Exception exception)
                {
                    Console.WriteLine($"{DateTime.Now} :: Exception: {exception.Message}");
                }
            }
        }
    }
    
  7. Programı çalıştırın ve Azure portalını denetleyin: Ad alanına ilişkin Genel Bakış penceresinde kuyruğunuzun adına tıklayın.Run the program, and check the Azure portal: click the name of your queue in the namespace Overview window. Kuyruğun Temel Bileşenler penceresi gösterilir.The queue Essentials screen is displayed. Kuyruğun Etkin İleti Sayısı değerinin 10 olduğuna dikkat edin.Notice that the Active Message Count value for the queue is now 10. İletileri almadan gönderen uygulamasını her çalıştırdığınızda (sonraki bölümde açıklandığı gibi), bu değer 10 artar.Each time you run the sender application without retrieving the messages (as described in the next section), this value increases by 10. Ayrıca, uygulamanın kuyruğa ileti eklediği her durumda kuyruğun geçerli boyutu, Temel Bileşenler penceresindeki Geçerli değerini artırır.Also note that the current size of the queue increments the Current value in the Essentials window each time the app adds messages to the queue.

    İleti boyutu

Kuyruktan ileti almaReceive messages from the queue

Gönderdiğiniz iletileri almak için başka bir .NET Core konsol uygulaması oluşturma ve yükleme Microsoft.Azure.ServiceBus NuGet paketine, önceki gönderen uygulamaya benzer.To receive the messages you sent, create another .NET Core console application and install the Microsoft.Azure.ServiceBus NuGet package, similar to the previous sender application.

Kuyruktan ileti almak için kod yazmaWrite code to receive messages from the queue

  1. Program.cs’de, ad alanı tanımının üst kısmına, sınıf bildiriminden önce aşağıdaki using deyimlerini ekleyin:In Program.cs, add the following using statements at the top of the namespace definition, before the class declaration:

    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using Microsoft.Azure.ServiceBus;
    
  2. Program sınıfında, aşağıdaki değişkenleri bildirin.Within the Program class, declare the following variables. ServiceBusConnectionString değişkenini, ad alanını oluştururken elde ettiğiniz bağlantı dizesine, QueueName değerini ise kuyruğu oluştururken kullandığınız ada ayarlayın:Set the ServiceBusConnectionString variable to the connection string that you obtained when creating the namespace, and set QueueName to the name that you used when creating the queue:

    const string ServiceBusConnectionString = "<your_connection_string>";
    const string QueueName = "<your_queue_name>";
    static IQueueClient queueClient;
    
  3. Main() öğesinin varsayılan içeriklerini aşağıdaki kod satırıyla değiştirin:Replace the default contents of Main() with the following line of code:

    MainAsync().GetAwaiter().GetResult();
    
  4. Main() öğesinden hemen sonra, RegisterOnMessageHandlerAndReceiveMessages() metoduna çağrı yapan aşağıdaki zaman uyumsuz MainAsync() metodunu ekleyin:Directly after Main(), add the following asynchronous MainAsync() method that calls the RegisterOnMessageHandlerAndReceiveMessages() method:

    static async Task MainAsync()
    {
        queueClient = new QueueClient(ServiceBusConnectionString, QueueName);
    
        Console.WriteLine("======================================================");
        Console.WriteLine("Press ENTER key to exit after receiving all the messages.");
        Console.WriteLine("======================================================");
    
        // Register the queue message handler and receive messages in a loop
        RegisterOnMessageHandlerAndReceiveMessages();
    
        Console.ReadKey();
    
        await queueClient.CloseAsync();
    }
    
  5. MainAsync() metodundan hemen sonra, ileti işleyiciyi kaydeden ve gönderen uygulama tarafından gönderilen iletileri alan aşağıdaki metodu ekleyin:Directly after the MainAsync() method, add the following method that registers the message handler and receives the messages sent by the sender application:

    static void RegisterOnMessageHandlerAndReceiveMessages()
    {
        // Configure the message handler options in terms of exception handling, number of concurrent messages to deliver, etc.
        var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler)
        {
            // Maximum number of concurrent calls to the callback ProcessMessagesAsync(), set to 1 for simplicity.
            // Set it according to how many messages the application wants to process in parallel.
            MaxConcurrentCalls = 1,
    
            // Indicates whether the message pump should automatically complete the messages after returning from user callback.
            // False below indicates the complete operation is handled by the user callback as in ProcessMessagesAsync().
            AutoComplete = false
        };
    
        // Register the function that processes messages.
        queueClient.RegisterMessageHandler(ProcessMessagesAsync, messageHandlerOptions);
    }
    
  6. Önceki metottan hemen sonra, alınan mesajları işlemek için aşağıdaki ProcessMessagesAsync() metodunu ekleyin:Directly after the previous method, add the following ProcessMessagesAsync() method to process the received messages:

    static async Task ProcessMessagesAsync(Message message, CancellationToken token)
    {
        // Process the message.
        Console.WriteLine($"Received message: SequenceNumber:{message.SystemProperties.SequenceNumber} Body:{Encoding.UTF8.GetString(message.Body)}");
    
        // Complete the message so that it is not received again.
        // This can be done only if the queue Client is created in ReceiveMode.PeekLock mode (which is the default).
        await queueClient.CompleteAsync(message.SystemProperties.LockToken);
    
        // Note: Use the cancellationToken passed as necessary to determine if the queueClient has already been closed.
        // If queueClient has already been closed, you can choose to not call CompleteAsync() or AbandonAsync() etc.
        // to avoid unnecessary exceptions.
    }
    
  7. Son olarak, olası özel durumları işlemek için aşağıdaki metodu ekleyin:Finally, add the following method to handle any exceptions that might occur:

    // Use this handler to examine the exceptions received on the message pump.
    static Task ExceptionReceivedHandler(ExceptionReceivedEventArgs exceptionReceivedEventArgs)
    {
        Console.WriteLine($"Message handler encountered an exception {exceptionReceivedEventArgs.Exception}.");
        var context = exceptionReceivedEventArgs.ExceptionReceivedContext;
        Console.WriteLine("Exception context for troubleshooting:");
        Console.WriteLine($"- Endpoint: {context.Endpoint}");
        Console.WriteLine($"- Entity Path: {context.EntityPath}");
        Console.WriteLine($"- Executing Action: {context.Action}");
        return Task.CompletedTask;
    }    
    
  8. Program.cs dosyanız aşağıdaki gibi görünmelidir:Here is what your Program.cs file should look like:

    namespace CoreReceiverApp
    {
        using System;
        using System.Text;
        using System.Threading;
        using System.Threading.Tasks;
        using Microsoft.Azure.ServiceBus;
    
        class Program
        {
            // Connection String for the namespace can be obtained from the Azure portal under the 
            // 'Shared Access policies' section.
            const string ServiceBusConnectionString = "<your_connection_string>";
            const string QueueName = "<your_queue_name>";
            static IQueueClient queueClient;
    
            static void Main(string[] args)
            {
                MainAsync().GetAwaiter().GetResult();
            }
    
            static async Task MainAsync()
            {
                queueClient = new QueueClient(ServiceBusConnectionString, QueueName);
    
                Console.WriteLine("======================================================");
                Console.WriteLine("Press ENTER key to exit after receiving all the messages.");
                Console.WriteLine("======================================================");
    
                // Register QueueClient's MessageHandler and receive messages in a loop
                RegisterOnMessageHandlerAndReceiveMessages();
    
                Console.ReadKey();
    
                await queueClient.CloseAsync();
            }
    
            static void RegisterOnMessageHandlerAndReceiveMessages()
            {
                // Configure the MessageHandler Options in terms of exception handling, number of concurrent messages to deliver etc.
                var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler)
                {
                    // Maximum number of Concurrent calls to the callback `ProcessMessagesAsync`, set to 1 for simplicity.
                    // Set it according to how many messages the application wants to process in parallel.
                    MaxConcurrentCalls = 1,
    
                    // Indicates whether MessagePump should automatically complete the messages after returning from User Callback.
                    // False below indicates the Complete will be handled by the User Callback as in `ProcessMessagesAsync` below.
                    AutoComplete = false
                };
    
                // Register the function that will process messages
                queueClient.RegisterMessageHandler(ProcessMessagesAsync, messageHandlerOptions);
            }
    
            static async Task ProcessMessagesAsync(Message message, CancellationToken token)
            {
                // Process the message
                Console.WriteLine($"Received message: SequenceNumber:{message.SystemProperties.SequenceNumber} Body:{Encoding.UTF8.GetString(message.Body)}");
    
                // Complete the message so that it is not received again.
                // This can be done only if the queueClient is created in ReceiveMode.PeekLock mode (which is default).
                await queueClient.CompleteAsync(message.SystemProperties.LockToken);
    
                // Note: Use the cancellationToken passed as necessary to determine if the queueClient has already been closed.
                // If queueClient has already been Closed, you may chose to not call CompleteAsync() or AbandonAsync() etc. calls 
               // to avoid unnecessary exceptions.
            }
    
            static Task ExceptionReceivedHandler(ExceptionReceivedEventArgs exceptionReceivedEventArgs)
            {
                Console.WriteLine($"Message handler encountered an exception {exceptionReceivedEventArgs.Exception}.");
                var context = exceptionReceivedEventArgs.ExceptionReceivedContext;
                Console.WriteLine("Exception context for troubleshooting:");
                Console.WriteLine($"- Endpoint: {context.Endpoint}");
                Console.WriteLine($"- Entity Path: {context.EntityPath}");
                Console.WriteLine($"- Executing Action: {context.Action}");
                return Task.CompletedTask;
            }
        }
    }
    
  9. Programı çalıştırın ve portalı tekrar denetleyin.Run the program, and check the portal again. Bu işlemden sonra Etkin Mesaj Sayısı ve Geçerli değerlerinin 0 olduğuna dikkat edin.Notice that the Active Message Count and Current values are now 0.

    Kuyruk uzunluğu

Tebrikler!Congratulations! Bir kuyruk oluşturdunuz, bu kuyruğa bir dizi ileti gönderdiniz ve aynı kuyruktan ileti aldınız.You have now created a queue, sent a set of messages to that queue, and received those messages from the same queue.

Not

Service Bus kaynakları ile yönetebileceğiniz hizmet veri yolu Gezgini.You can manage Service Bus resources with Service Bus Explorer. Hizmet veri yolu Gezgini, bir Service Bus ad alanınıza bağlanın ve mesajlaşma varlıkları kolay bir şekilde yönetmek kullanıcıların sağlar.The Service Bus Explorer allows users to connect to a Service Bus namespace and administer messaging entities in an easy manner. Araç, içeri/dışarı aktarma işlevleri veya konu, kuyruklar, abonelikler, geçiş hizmetleri, bildirim hub'ları ve olay hub'ları test etme olanağı gibi gelişmiş özellikler sağlar.The tool provides advanced features like import/export functionality or the ability to test topic, queues, subscriptions, relay services, notification hubs and events hubs.

Sonraki adımlarNext steps

Service Bus mesajlaşmasının daha gelişmiş özelliklerini gösteren örneklerin bulunduğu GitHub depomuza göz atın.Check out our GitHub repository with samples that demonstrate some of the more advanced features of Service Bus messaging.