Enviar eventos para ou receber eventos de hubs de eventos do Azure usando o .NET CoreSend events to or receive events from Azure Event Hubs using .NET Core

Os Hubs de Eventos são um serviço que processa grandes quantidades de dados de eventos (telemetria) a partir de aplicativos e dispositivos conectados.Event Hubs is a service that processes large amounts of event data (telemetry) from connected devices and applications. Depois de coletar dados para Hubs de Eventos, você pode armazenar os dados usando um cluster de armazenamento ou transformá-los usando um provedor de análise em tempo real.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. Essa funcionalidade de coleta e processamento de eventos em grande escala é um componente fundamental de arquiteturas de aplicativos modernas, incluindo a IoT (Internet das Coisas).This large-scale event collection and processing capability is a key component of modern application architectures including the Internet of Things (IoT). Para obter uma visão detalhada dos Hubs de Eventos, confira Visão geral de Hubs de Eventos e Recursos de Hubs de Eventos.For detailed overview of Event Hubs, see Event Hubs overview and Event Hubs features.

Este tutorial mostra como criar aplicativos .NET Core no C# para enviar eventos ou receber eventos de um hub de eventos.This tutorial shows how to create .NET Core applications in C# to send events to or receive events from an event hub.

Observação

Você pode baixar este início rápido como uma amostra do GitHub, substituir as cadeias de caracteres EventHubConnectionString e EventHubName pelos valores de hub de eventos e executá-los.You can download this quickstart as a sample from the GitHub, replace EventHubConnectionString and EventHubName strings with your event hub values, and run it. Como alternativa, é possível seguir as etapas deste tutorial para criar sua própria solução.Alternatively, you can follow the steps in this tutorial to create your own.

Pré-requisitosPrerequisites

  • Microsoft Visual Studio 2019.Microsoft Visual Studio 2019.
  • Ferramentas do .NET Core do Visual Studio 2015 ou 2017..NET Core Visual Studio 2015 or 2017 tools.
  • Crie um namespace de hubs de eventos e um hub de eventos.Create an Event Hubs namespace and an event hub. A primeira etapa é usar o portal do Azure para criar um namespace do tipo Hubs de eventos e obter as credenciais de gerenciamento das quais que seu aplicativo precisa para se comunicar com o hub de eventos.The first step is to use the Azure portal to create a namespace of type Event Hubs, and obtain the management credentials your application needs to communicate with the event hub. Para criar um namespace e um hub de eventos, siga o procedimento neste artigo.To create a namespace and an event hub, follow the procedure in this article. Em seguida, obtenha a cadeia de conexão para o namespace do hub de eventos seguindo as instruções do artigo: obter a cadeia de conexão.Then, get the connection string for the event hub namespace by following instructions from the article: Get connection string. Você usa a cadeia de conexão posteriormente no tutorial.You use the connection string later in this tutorial.

Enviar eventosSend events

Esta seção mostra como criar um aplicativo de console do .NET Core para enviar eventos para um hub de eventos.This section shows you how to create a .NET Core console application to send events to an event hub.

Criar um aplicativo de consoleCreate a console application

Inicie o Visual Studio.Start Visual Studio. No menu Arquivo, clique em Novo e em Projeto.From the File menu, click New, and then click Project. Crie um aplicativo de console do .NET Core.Create a .NET Core console application.

Novo Projeto

Adicione o pacote NuGet de Hubs de EventoAdd the Event Hubs NuGet package

Adicione o pacote NuGet Microsoft.Azure.EventHubs de biblioteca do .NET Core ao projeto seguindo estas etapas:Add the Microsoft.Azure.EventHubs .NET Core library NuGet package to your project by following these steps:

  1. Clique com o botão direito do mouse no projeto recém-criado e selecione Gerenciar Pacotes NuGet.Right-click the newly created project and select Manage NuGet Packages.
  2. Clique na guia Procurar, pesquise por "Microsoft.Azure.EventHubs" e selecione o pacote Microsoft.Azure.EventHubs.Click the Browse tab, then search for "Microsoft.Azure.EventHubs" and select the Microsoft.Azure.EventHubs package. Clique em Instalar para concluir a instalação e feche essa caixa de diálogo.Click Install to complete the installation, then close this dialog box.

Escrever código para enviar mensagens ao hub de eventosWrite code to send messages to the event hub

  1. Adicione as instruções using a seguir na parte superior do arquivo 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. Adicione constantes à classe Program para a cadeia de conexão de Hubs de Eventos e o caminho da entidade (nome do hub de eventos individual).Add constants to the Program class for the Event Hubs connection string and entity path (individual event hub name). Substitua os espaços reservados nos colchetes pelos valores adequados que foram obtidos na criação do hub de eventos.Replace the placeholders in brackets with the proper values that were obtained when creating the event hub. Verifique se {Event Hubs connection string} é a cadeia de conexão de nível de namespace e não a cadeia de hub de eventos.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. Adicione um novo método chamado MainAsync à classe Program, conforme demonstrado a seguir: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. Adicione um novo método chamado SendMessagesToEventHub à classe Program, conforme demonstrado a seguir: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. Adicione o código a seguir ao método Main na classe Program:Add the following code to the Main method in the Program class:

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

    Program.cs deve ficar assim.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. Execute o programa e certifique-se de que não existem erros.Run the program, and ensure that there are no errors.

Receber eventosReceive events

Esta seção mostra como escrever um aplicativo de console .NET Core que recebe mensagens de um hub de eventos usando o host do processador de eventos.This section shows how to write a .NET Core console application that receives messages from an event hub using the Event Processor Host. O Host do Processador de Eventos é uma classe do .NET que simplifica o recebimento de eventos de hubs de eventos ao gerenciar pontos de verificação persistentes e recebimentos paralelos desses hubs de eventos.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. Ao usar o Host do Processador de Eventos, você pode dividir eventos através de vários receptores, mesmo quando hospedados em nós diferentes.Using the Event Processor Host, you can split events across multiple receivers, even when hosted in different nodes. Este exemplo mostra como usar o Host do Processador de Eventos para um único destinatário.This example shows how to use the Event Processor Host for a single receiver.

Observação

Você pode baixar este início rápido como uma amostra com o GitHub, substituir as cadeias de caracteres EventHubConnectionString e EventHubName, StorageAccountName, StorageAccountKey e StorageContainerName com seus valores de hub de eventos, e executá-los.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. Como alternativa, é possível seguir as etapas deste tutorial para criar sua própria solução.Alternatively, you can follow the steps in this tutorial to create your own.

Criar uma conta de armazenamento para o Host do Processador de EventosCreate a storage account for Event Processor Host

O Host do Processador de Eventos é um agente inteligente que simplifica o recebimento de eventos de hubs de eventos ao gerenciar pontos de verificação persistentes e recebimentos paralelos.The Event Processor Host is an intelligent agent that simplifies receiving events from Event Hubs by managing persistent checkpoints and parallel receives. Para o ponto de verificação, o Host do Processador de Eventos requer uma conta de armazenamento.For checkpointing, the Event Processor Host requires a storage account. O exemplo a seguir mostra como criar uma conta de armazenamento e como obter suas chaves de acesso:The following example shows how to create a storage account and how to get its keys for access:

  1. No portal do Azure selecione Criar um recurso na parte superior esquerda da tela.In the Azure portal, and select Create a resource at the top left of the screen.

  2. Selecione Armazenamento e, em seguida, Conta de armazenamento – blob, arquivo, tabela, fila.Select Storage, then select Storage account - blob, file, table, queue.

    Selecionar Conta de Armazenamento

  3. Na página Criar conta de armazenamento, execute as etapas a seguir:On the Create storage account page, take the following steps:

    1. Insira um nome para a conta de armazenamento.Enter a name for the storage account.

    2. Escolha uma assinatura do Azure que contém o hub de eventos.Choose an Azure subscription that contains the event hub.

    3. Selecione o grupo de recursos que tem o hub de eventos.Select the resource group that has the event hub.

    4. Selecione um local para criar o recurso.Select a location in which to create the resource.

    5. Em seguida clique em Revisar + criar.Then click Review + create.

      Criar conta de armazenamento - página

  4. Na página Revisar + criar, revise os valores e selecione Criar.On the Review + create page, review the values, and select Create.

    Analisar configurações e criação de conta de armazenamento

  5. Depois que você consulte os implantações bem-sucedidas mensagem, selecione ir para o recurso na parte superior da página.After you see the Deployments Succeeded message, select Go to resource at the top of the page. Você também pode iniciar a página da conta de armazenamento selecionando sua conta de armazenamento da lista de recursos.You can also launch the Storage Account page by selecting your storage account from the resource list.

    Selecione a conta de armazenamento na implantação

  6. Na janela Dados Básicos, selecione Blobs.In the Essentials window, select Blobs.

    Selecione o serviço de Blobs

  7. Selecione + Contêiner na parte superior, insira um nome para o contêiner e selecione OK.Select + Container at the top, enter a name for the container, and select OK.

    Criar um contêiner de blob

  8. Selecione Chaves de acesso no menu à esquerda e copie o valor de key1.Select Access keys in the left-side menu, and copy the value of key1.

    Salve esses valores no Bloco de notas ou em outro local temporário.Save the following values to Notepad or some other temporary location.

    • Nome da conta de armazenamentoName of the storage account
    • Chave de acesso da conta de armazenamentoAccess key for the storage account
    • Nome do contêinerName of the container

Criar um aplicativo de consoleCreate a console application

Inicie o Visual Studio.Start Visual Studio. No menu Arquivo, clique em Novo e em Projeto.From the File menu, click New, and then click Project. Crie um aplicativo de console do .NET Core.Create a .NET Core console application.

Novo Projeto

Adicione o pacote NuGet de Hubs de EventoAdd the Event Hubs NuGet package

Adicione os pacotes NuGet da biblioteca .NET Standard Microsoft.Azure.EventHubs e Microsoft.Azure.EventHubs.Processor a seu projeto seguindo estas etapas:Add the Microsoft.Azure.EventHubs and Microsoft.Azure.EventHubs.Processor .NET Standard library NuGet packages to your project by following these steps:

  1. Clique com o botão direito do mouse no projeto recém-criado e selecione Gerenciar Pacotes NuGet.Right-click the newly created project and select Manage NuGet Packages.
  2. Clique na guia Procurar, pesquise por Microsoft.Azure.EventHubs e selecione o pacote Microsoft.Azure.EventHubs.Click the Browse tab, search for Microsoft.Azure.EventHubs, and then select the Microsoft.Azure.EventHubs package. Clique em Instalar para concluir a instalação e feche essa caixa de diálogo.Click Install to complete the installation, then close this dialog box.
  3. Repita as etapas 1 e 2 e instalar o pacote Microsoft.Azure.EventHubs.Processor.Repeat steps 1 and 2, and install the Microsoft.Azure.EventHubs.Processor package.

Implementar a interface IEventProcessorImplement the IEventProcessor interface

  1. No Gerenciador de Soluções, clique com o botão direito do mouse no projeto, clique em Adicionar e em Classe.In Solution Explorer, right-click the project, click Add, and then click Class. Nomeie a nova classe SimpleEventProcessor.Name the new class SimpleEventProcessor.

  2. Abra o arquivo SimpleEventProcessor.cs e adicione as seguintes instruções using à parte superior do arquivo.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. Implementar o IEventProcessor interface.Implement the IEventProcessor interface. Substitua todo o conteúdo da classe SimpleEventProcessor pelo código a seguir: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();
        }
    }
    

Atualizar o método Main para usar o SimpleEventProcessorUpdate the Main method to use SimpleEventProcessor

  1. Adicione as instruções using a seguir à parte superior do arquivo 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. Adicione constantes à classe Program da cadeia de conexão do hub de eventos, do nome do hub de eventos, do nome do contêiner da conta de armazenamento, do nome da conta de armazenamento e da chave da conta de armazenamento.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. Adicione o código a seguir, substituindo os espaços reservados pelos valores correspondentes: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. Adicione um novo método chamado MainAsync à classe Program, conforme demonstrado a seguir: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. Adicione a linha de código a seguir ao método Main:Add the following line of code to the Main method:

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

    O arquivo Program.cs deve ficar assim: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. Execute o programa e certifique-se de que não existem erros.Run the program, and ensure that there are no errors.

Próximas etapasNext steps

Leia os seguintes artigos:Read the following articles: