Отправка событий или получение событий из концентраторов событий Azure с помощью .NET CoreSend events to or receive events from Azure Event Hubs using .NET Core

Центры событий — это служба, которая обрабатывает большие объемы данных телеметрии о событиях, поступающих от подключенных устройств и приложений.Event Hubs is a service that processes large amounts of event data (telemetry) from connected devices and applications. После сбора дынных в Центрах событий их можно сохранить с помощью кластера хранилища или преобразовать с помощью поставщика аналитики в реальном времени.After you collect data into Event Hubs, you can store the data using a storage cluster or transform it using a real-time analytics provider. Эта возможность сбора и обработки большого объема данных о событиях является ключевым компонентом в современных архитектурах приложений, включая "Интернет вещей".This large-scale event collection and processing capability is a key component of modern application architectures including the Internet of Things (IoT). Подробный обзор Центров событий см. в статьях Что такое Центры событий Azure? и Обзор функций Центров событий.For detailed overview of Event Hubs, see Event Hubs overview and Event Hubs features.

В этом руководстве показано, как создавать приложения .NET Core C# в для отправки событий в концентратор событий или получения событий из него.This tutorial shows how to create .NET Core applications in C# to send events to or receive events from an event hub.

Примечание

Вы можете скачать это краткое руководство в качестве примера с сайта GitHub, заменить строки EventHubConnectionString и EventHubName значениями для своего концентратора событий и выполнить этот пример.You can download this quickstart as a sample from the GitHub, replace EventHubConnectionString and EventHubName strings with your event hub values, and run it. Или следуйте инструкциям из этого руководства, чтобы создать собственное решение.Alternatively, you can follow the steps in this tutorial to create your own.

предварительные требованияPrerequisites

Отправка событийSend events

В этом разделе показано, как создать консольное приложение .NET Core для отправки событий в концентратор событий.This section shows you how to create a .NET Core console application to send events to an event hub.

Создание консольного приложениеCreate a console application

Запустите Visual Studio.Start Visual Studio. В меню Файл выберите команду Создать, а затем — Проект.From the File menu, click New, and then click Project. Создайте консольное приложение .NET Core.Create a .NET Core console application.

Новый проект

Добавление пакета NuGet для Центров событийAdd the Event Hubs NuGet package

Добавьте пакет NuGet библиотеки .NET Core Microsoft.Azure.EventHubs в проект, сделав следующее:Add the Microsoft.Azure.EventHubs .NET Core library NuGet package to your project by following these steps:

  1. Щелкните созданный проект правой кнопкой мыши и выберите Управление пакетами NuGet.Right-click the newly created project and select Manage NuGet Packages.
  2. Откройте вкладку Обзор, а затем выполните поиск по фразе Microsoft.Azure.EventHubs и выберите пакет Microsoft.Azure.EventHubs.Click the Browse tab, then search for "Microsoft.Azure.EventHubs" and select the Microsoft.Azure.EventHubs package. Щелкните Установить , чтобы выполнить установку, а затем закройте это диалоговое окно.Click Install to complete the installation, then close this dialog box.

Написание кода для отправки сообщений в концентратор событийWrite code to send messages to the event hub

  1. Добавьте следующие операторы using в начало файла Program.cs.Add the following using statements to the top of the Program.cs file:

    using Microsoft.Azure.EventHubs;
    using System.Text;
    using System.Threading.Tasks;
    
  2. Добавьте в класс Program константы для строки подключения Центров событий и пути сущности (имя отдельного концентратора событий).Add constants to the Program class for the Event Hubs connection string and entity path (individual event hub name). Замените заполнители в скобках соответствующими значениями, которые были получены при создании концентратора событий.Replace the placeholders in brackets with the proper values that were obtained when creating the event hub. Убедитесь, что {Event Hubs connection string} — это строка подключения на уровне пространства имен, а не концентратора событий.Make sure that the {Event Hubs connection string} is the namespace-level connection string, and not the event hub string.

    private static EventHubClient eventHubClient;
    private const string EventHubConnectionString = "{Event Hubs connection string}";
    private const string EventHubName = "{Event Hub path/name}";
    
  3. Добавьте новый метод с именем MainAsync в класс Program, как показано далее:Add a new method named MainAsync to the Program class, as follows:

    private static async Task MainAsync(string[] args)
    {
        // Creates an EventHubsConnectionStringBuilder object from the connection string, and sets the EntityPath.
        // Typically, the connection string should have the entity path in it, but this simple scenario
        // uses the connection string from the namespace.
        var connectionStringBuilder = new EventHubsConnectionStringBuilder(EventHubConnectionString)
        {
            EntityPath = EventHubName
        };
    
        eventHubClient = EventHubClient.CreateFromConnectionString(connectionStringBuilder.ToString());
    
        await SendMessagesToEventHub(100);
    
        await eventHubClient.CloseAsync();
    
        Console.WriteLine("Press ENTER to exit.");
        Console.ReadLine();
    }
    
  4. Добавьте новый метод с именем SendMessagesToEventHub в класс Program, как показано далее:Add a new method named SendMessagesToEventHub to the Program class, as follows:

    // Uses the event hub client to send 100 messages to the event hub.
    private static async Task SendMessagesToEventHub(int numMessagesToSend)
    {
        for (var i = 0; i < numMessagesToSend; i++)
        {
            try
            {
                var message = $"Message {i}";
                Console.WriteLine($"Sending message: {message}");
                await eventHubClient.SendAsync(new EventData(Encoding.UTF8.GetBytes(message)));
            }
            catch (Exception exception)
            {
                Console.WriteLine($"{DateTime.Now} > Exception: {exception.Message}");
            }
    
            await Task.Delay(10);
        }
    
        Console.WriteLine($"{numMessagesToSend} messages sent.");
    }
    
  5. В метод Main в классе Program добавьте следующий код.Add the following code to the Main method in the Program class:

    MainAsync(args).GetAwaiter().GetResult();
    

    Вот как будет выглядеть файл Program.cs.Here is what your Program.cs should look like.

    namespace SampleSender
    {
        using System;
        using System.Text;
        using System.Threading.Tasks;
        using Microsoft.Azure.EventHubs;
    
        public class Program
        {
            private static EventHubClient eventHubClient;
            private const string EventHubConnectionString = "{Event Hubs connection string}";
            private const string EventHubName = "{Event Hub path/name}";
    
            public static void Main(string[] args)
            {
                MainAsync(args).GetAwaiter().GetResult();
            }
    
            private static async Task MainAsync(string[] args)
            {
                // Creates an EventHubsConnectionStringBuilder object from the connection string, and sets the EntityPath.
                // Typically, the connection string should have the entity path in it, but for the sake of this simple scenario
                // we are using the connection string from the namespace.
                var connectionStringBuilder = new EventHubsConnectionStringBuilder(EventHubConnectionString)
                {
                    EntityPath = EventHubName
                };
    
                eventHubClient = EventHubClient.CreateFromConnectionString(connectionStringBuilder.ToString());
    
                await SendMessagesToEventHub(100);
    
                await eventHubClient.CloseAsync();
    
                Console.WriteLine("Press ENTER to exit.");
                Console.ReadLine();
            }
    
            // Uses the event hub client to send 100 messages to the event hub.
            private static async Task SendMessagesToEventHub(int numMessagesToSend)
            {
                for (var i = 0; i < numMessagesToSend; i++)
                {
                    try
                    {
                        var message = $"Message {i}";
                        Console.WriteLine($"Sending message: {message}");
                        await eventHubClient.SendAsync(new EventData(Encoding.UTF8.GetBytes(message)));
                    }
                    catch (Exception exception)
                    {
                        Console.WriteLine($"{DateTime.Now} > Exception: {exception.Message}");
                    }
    
                    await Task.Delay(10);
                }
    
                Console.WriteLine($"{numMessagesToSend} messages sent.");
            }
        }
    }
    
  6. Запустите программу и убедитесь в отсутствии ошибок.Run the program, and ensure that there are no errors.

Получение событийReceive events

В этом разделе показано, как создать консольное приложение .NET Core, которое получает сообщения из концентратора событий с помощью узла обработчика событий.This section shows how to write a .NET Core console application that receives messages from an event hub using the Event Processor Host. Узел обработчика событий представляет собой класс .NET, который упрощает прием событий из концентраторов событий путем управления постоянными контрольными точками и одновременно принимает сообщения от этих концентраторов событий.The Event Processor Host is a .NET class that simplifies receiving events from event hubs by managing persistent checkpoints and parallel receives from those event hubs. С помощью класса EventProcessorHost можно разделить события между несколькими получателями даже в том случае, если они размещены в разных узлах.Using the Event Processor Host, you can split events across multiple receivers, even when hosted in different nodes. В этом примере показано, как использовать EventProcessorHost для одного получателя.This example shows how to use the Event Processor Host for a single receiver.

Примечание

Вы можете скачать это краткое руководство в качестве примера с сайта GitHub, заменить строки EventHubConnectionString, а также EventHubName, StorageAccountName, StorageAccountKey и StorageContainerName значениями для своего концентратора событий и выполнить этот пример.You can download this quickstart as a sample from the GitHub, replace EventHubConnectionString and EventHubName, StorageAccountName, StorageAccountKey, and StorageContainerName strings with your event hub values, and run it. Или следуйте инструкциям из этого руководства, чтобы создать собственное решение.Alternatively, you can follow the steps in this tutorial to create your own.

Создание учетной записи хранения для узла обработчика событийCreate a storage account for Event Processor Host

Узел обработчика событий представляет собой интеллектуальный агент, который упрощает прием событий от Центров событий путем управления постоянными контрольными точками и параллельным приемом.The Event Processor Host is an intelligent agent that simplifies receiving events from Event Hubs by managing persistent checkpoints and parallel receives. Для создания контрольных точек узлу обработчика событий требуется учетная запись хранения.For checkpointing, the Event Processor Host requires a storage account. В следующем примере показано, как создать учетную запись хранения и как получить ключи для доступа:The following example shows how to create a storage account and how to get its keys for access:

  1. На портале Azure выберите Создать ресурс в левой верхней части экрана.In the Azure portal, and select Create a resource at the top left of the screen.

  2. Выберите Хранилище, а затем Учетная запись хранения — BLOB-объект, файл, таблица, очередь.Select Storage, then select Storage account - blob, file, table, queue.

    Выбор учетной записи хранения

  3. На странице Создание учетной записи хранения выполните следующие действия:On the Create storage account page, take the following steps:

    1. Введите имя учетной записи хранения.Enter a name for the storage account.

    2. Выберите подписку Azure, содержащую концентратор событий.Choose an Azure subscription that contains the event hub.

    3. Выберите группу ресурсов, содержащую концентратор событий.Select the resource group that has the event hub.

    4. Выберите расположение, в котором будет создан ресурс.Select a location in which to create the resource.

    5. Щелкните Просмотр и создание.Then click Review + create.

      Страница "Создание учетной записи хранения"

  4. На странице Просмотр и создание проверьте значения и выберите Создать.On the Review + create page, review the values, and select Create.

    Проверка параметров и создание учетной записи хранения

  5. Как только вы увидите развертываний завершены успешно сообщение, выберите перейти к ресурсу в верхней части страницы.After you see the Deployments Succeeded message, select Go to resource at the top of the page. Вы также можете открыть страницу учетной записи хранения, выбрав эту запись в списке ресурсов.You can also launch the Storage Account page by selecting your storage account from the resource list.

    Выбор учетной записи хранения из развертывания

  6. В окне Основные компоненты выберите BLOB-объекты.In the Essentials window, select Blobs.

    Выбор службы BLOB-объектов

  7. В верхней части выберите + Контейнер, введите имя для контейнера и нажмите кнопку ОК.Select + Container at the top, enter a name for the container, and select OK.

    Создание контейнера BLOB-объектов

  8. Выберите Ключи доступа в меню слева и скопируйте значение key1.Select Access keys in the left-side menu, and copy the value of key1.

    Сохраните на время указанные ниже значения в Блокноте или любом другом месте.Save the following values to Notepad or some other temporary location.

    • Имя учетной записи храненияName of the storage account
    • Доступ к учетной записи храненияAccess key for the storage account
    • Имя контейнераName of the container

Создание консольного приложениеCreate a console application

Запустите Visual Studio.Start Visual Studio. В меню Файл выберите команду Создать, а затем — Проект.From the File menu, click New, and then click Project. Создайте консольное приложение .NET Core.Create a .NET Core console application.

Новый проект

Добавление пакета NuGet для Центров событийAdd the Event Hubs NuGet package

Чтобы добавить в проект пакеты NuGet стандартной библиотеки .NET Microsoft.Azure.EventHubs и Microsoft.Azure.EventHubs.Processor, выполните следующие действия:Add the Microsoft.Azure.EventHubs and Microsoft.Azure.EventHubs.Processor .NET Standard library NuGet packages to your project by following these steps:

  1. Щелкните созданный проект правой кнопкой мыши и выберите Управление пакетами NuGet.Right-click the newly created project and select Manage NuGet Packages.
  2. Откройте вкладку Обзор, а затем выполните поиск по фразе Microsoft.Azure.EventHubs и выберите пакет Microsoft.Azure.EventHubs.Click the Browse tab, search for Microsoft.Azure.EventHubs, and then select the Microsoft.Azure.EventHubs package. Щелкните Установить , чтобы выполнить установку, а затем закройте это диалоговое окно.Click Install to complete the installation, then close this dialog box.
  3. Повторите шаги 1 и 2 и установите пакет Microsoft.Azure.EventHubs.Processor.Repeat steps 1 and 2, and install the Microsoft.Azure.EventHubs.Processor package.

Реализация интерфейса IEventProcessorImplement the IEventProcessor interface

  1. В обозревателе решений щелкните правой кнопкой мыши проект, выберите Добавить, а затем щелкните Класс.In Solution Explorer, right-click the project, click Add, and then click Class. Назовите новый класс SimpleEventProcessor.Name the new class SimpleEventProcessor.

  2. Откройте файл SimpleEventProcessor.cs и добавьте в его начало следующие операторы using.Open the SimpleEventProcessor.cs file and add the following using statements to the top of the file.

    using Microsoft.Azure.EventHubs;
    using Microsoft.Azure.EventHubs.Processor;
    using System.Threading.Tasks;
    
  3. Реализуйте интерфейс IEventProcessor.Implement the IEventProcessor interface. Замените все содержимое класса SimpleEventProcessor следующим кодом:Replace the entire contents of the SimpleEventProcessor class with the following code:

    public class SimpleEventProcessor : IEventProcessor
    {
        public Task CloseAsync(PartitionContext context, CloseReason reason)
        {
            Console.WriteLine($"Processor Shutting Down. Partition '{context.PartitionId}', Reason: '{reason}'.");
            return Task.CompletedTask;
        }
    
        public Task OpenAsync(PartitionContext context)
        {
            Console.WriteLine($"SimpleEventProcessor initialized. Partition: '{context.PartitionId}'");
            return Task.CompletedTask;
        }
    
        public Task ProcessErrorAsync(PartitionContext context, Exception error)
        {
            Console.WriteLine($"Error on Partition: {context.PartitionId}, Error: {error.Message}");
            return Task.CompletedTask;
        }
    
        public Task ProcessEventsAsync(PartitionContext context, IEnumerable<EventData> messages)
        {
            foreach (var eventData in messages)
            {
                var data = Encoding.UTF8.GetString(eventData.Body.Array, eventData.Body.Offset, eventData.Body.Count);
                Console.WriteLine($"Message received. Partition: '{context.PartitionId}', Data: '{data}'");
            }
    
            return context.CheckpointAsync();
        }
    }
    

Обновление метода Main для использования класса SimpleEventProcessorUpdate the Main method to use SimpleEventProcessor

  1. Добавьте следующие операторы using в начало файла program.cs.Add the following using statements to the top of the Program.cs file.

    using Microsoft.Azure.EventHubs;
    using Microsoft.Azure.EventHubs.Processor;
    using System.Threading.Tasks;
    
  2. Добавьте в класс Program константы для строки подключения концентраторов событий, имени концентратора событий, имени контейнера учетной записи хранения, имени учетной записи хранения и ключа учетной записи хранения.Add constants to the Program class for the event hub connection string, event hub name, storage account container name, storage account name, and storage account key. Добавьте следующий код, заменив заполнители соответствующими значениями:Add the following code, replacing the placeholders with their corresponding values:

    private const string EventHubConnectionString = "{Event Hubs connection string}";
    private const string EventHubName = "{Event Hub path/name}";
    private const string StorageContainerName = "{Storage account container name}";
    private const string StorageAccountName = "{Storage account name}";
    private const string StorageAccountKey = "{Storage account key}";
    
    private static readonly string StorageConnectionString = string.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}", StorageAccountName, StorageAccountKey);
    
  3. Добавьте новый метод с именем MainAsync в класс Program, как показано далее:Add a new method named MainAsync to the Program class, as follows:

    private static async Task MainAsync(string[] args)
    {
        Console.WriteLine("Registering EventProcessor...");
    
        var eventProcessorHost = new EventProcessorHost(
            EventHubName,
            PartitionReceiver.DefaultConsumerGroupName,
            EventHubConnectionString,
            StorageConnectionString,
            StorageContainerName);
    
        // Registers the Event Processor Host and starts receiving messages
        await eventProcessorHost.RegisterEventProcessorAsync<SimpleEventProcessor>();
    
        Console.WriteLine("Receiving. Press ENTER to stop worker.");
        Console.ReadLine();
    
        // Disposes of the Event Processor Host
        await eventProcessorHost.UnregisterEventProcessorAsync();
    }
    
  4. Добавьте в метод Main следующую строку кода:Add the following line of code to the Main method:

    MainAsync(args).GetAwaiter().GetResult();
    

    Вот как будет выглядеть файл Program.cs.Here is what your Program.cs file should look like:

    namespace SampleEphReceiver
    {
    
        public class Program
        {
            private const string EventHubConnectionString = "{Event Hubs connection string}";
            private const string EventHubName = "{Event Hub path/name}";
            private const string StorageContainerName = "{Storage account container name}";
            private const string StorageAccountName = "{Storage account name}";
            private const string StorageAccountKey = "{Storage account key}";
    
            private static readonly string StorageConnectionString = string.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}", StorageAccountName, StorageAccountKey);
    
            public static void Main(string[] args)
            {
                MainAsync(args).GetAwaiter().GetResult();
            }
    
            private static async Task MainAsync(string[] args)
            {
                Console.WriteLine("Registering EventProcessor...");
    
                var eventProcessorHost = new EventProcessorHost(
                    EventHubName,
                    PartitionReceiver.DefaultConsumerGroupName,
                    EventHubConnectionString,
                    StorageConnectionString,
                    StorageContainerName);
    
                // Registers the Event Processor Host and starts receiving messages
                await eventProcessorHost.RegisterEventProcessorAsync<SimpleEventProcessor>();
    
                Console.WriteLine("Receiving. Press ENTER to stop worker.");
                Console.ReadLine();
    
                // Disposes of the Event Processor Host
                await eventProcessorHost.UnregisterEventProcessorAsync();
            }
        }
    }
    
  5. Запустите программу и убедитесь в отсутствии ошибок.Run the program, and ensure that there are no errors.

Следующие шагиNext steps

Ознакомьтесь со следующими статьями:Read the following articles: