Envío o recepción de eventos en Azure Event Hubs mediante .NET CoreSend events to or receive events from Azure Event Hubs using .NET Core

Event Hubs es un servicio que procesa grandes cantidades de datos de eventos (telemetría) desde aplicaciones y dispositivos conectados.Event Hubs is a service that processes large amounts of event data (telemetry) from connected devices and applications. Después de recopilar datos en Event Hubs, puede almacenarlos mediante un clúster de almacenamiento o transformarlos por medio de un proveedor de análisis en tiempo 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. Esta funcionalidad de recopilación y procesamiento de eventos a gran escala es un componente clave de las modernas arquitecturas de aplicaciones, entre las que se incluye Internet de las cosas (IoT).This large-scale event collection and processing capability is a key component of modern application architectures including the Internet of Things (IoT). Para más información sobre Event Hubs, consulte Introducción a Event Hubs y Características de Event Hubs.For detailed overview of Event Hubs, see Event Hubs overview and Event Hubs features.

En este tutorial se describe cómo crear aplicaciones de .NET Core en C# para enviar o recibir eventos en un centro de eventos.This tutorial shows how to create .NET Core applications in C# to send events to or receive events from an event hub.

Nota

Puede descargar esta guía de inicio rápido como un ejemplo desde GitHub, reemplazar las cadenas EventHubConnectionString y EventHubName por los valores del centro de eventos, y ejecutarlo.You can download this quickstart as a sample from the GitHub, replace EventHubConnectionString and EventHubName strings with your event hub values, and run it. También puede seguir los pasos de este tutorial para crear el suyo propio.Alternatively, you can follow the steps in this tutorial to create your own.

Requisitos previosPrerequisites

  • Microsoft Visual Studio 2019.Microsoft Visual Studio 2019.
  • Herramientas de .NET Core Visual Studio 2015 o 2017..NET Core Visual Studio 2015 or 2017 tools.
  • Creación de un espacio de nombres de Event Hubs y un centro de eventosCreate an Event Hubs namespace and an event hub. El primer paso consiste en usar Azure Portal para crear un espacio de nombres de tipo Event Hubs y obtener las credenciales de administración que la aplicación necesita para comunicarse con el centro 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 crear un espacio de nombres y un centro de eventos, siga el procedimiento que se indica en este artículo.To create a namespace and an event hub, follow the procedure in this article. A continuación, obtenga la cadena de conexión para el espacio de nombres del centro de eventos siguiendo las instrucciones del artículo: Obtenga la cadena de conexión.Then, get the connection string for the event hub namespace by following instructions from the article: Get connection string. Utilizará la cadena de conexión más adelante en el tutorial.You use the connection string later in this tutorial.

Envío de eventosSend events

En esta sección se muestra cómo crear una aplicación de consola de .NET Core para enviar eventos a un centro de eventos.This section shows you how to create a .NET Core console application to send events to an event hub.

Creación de una aplicación de consolaCreate a console application

Inicie Visual Studio.Start Visual Studio. En el menú Archivo, haga clic en Nuevo y en Proyecto.From the File menu, click New, and then click Project. Cree una aplicación de consola de .NET Core.Create a .NET Core console application.

Nuevo proyecto

Incorporación del paquete NuGet de Event HubsAdd the Event Hubs NuGet package

Agregue el paquete NuGet de la biblioteca .NET Core Microsoft.Azure.EventHubs a su proyecto siguiendo estos pasos:Add the Microsoft.Azure.EventHubs .NET Core library NuGet package to your project by following these steps:

  1. Haga clic con el botón derecho en el proyecto recién creado y seleccione Administrar paquetes NuGet.Right-click the newly created project and select Manage NuGet Packages.
  2. Haga clic en la pestaña Examinar y, después, busque "Microsoft.Azure.EventHubs" y seleccione el paquete Microsoft.Azure.EventHubs.Click the Browse tab, then search for "Microsoft.Azure.EventHubs" and select the Microsoft.Azure.EventHubs package. Haga clic en Instalar para completar la instalación y, a continuación, cierre este cuadro de diálogo.Click Install to complete the installation, then close this dialog box.

Escritura de código para enviar mensajes al centro de eventosWrite code to send messages to the event hub

  1. Agregue las siguientes instrucciones using al principio del archivo 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. Agregue constantes a la clase Program para la cadena de conexión de Event Hubs y la ruta de la entidad (nombre de centro de eventos individual).Add constants to the Program class for the Event Hubs connection string and entity path (individual event hub name). Reemplace los marcadores de posición entre llaves por los valores adecuados obtenidos al crear el centro de eventos.Replace the placeholders in brackets with the proper values that were obtained when creating the event hub. Asegúrese de que {Event Hubs connection string} es la cadena de conexión en el nivel de espacio de nombres y no la cadena de Event Hub.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. Agregue un nuevo método denominado MainAsync a la clase Program, de esta manera: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. Agregue un nuevo método denominado SendMessagesToEventHub a la clase Program, de esta manera: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. Agregue el siguiente código al método Main de la clase Program:Add the following code to the Main method in the Program class:

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

    Este es el aspecto que debería tener 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. Ejecute el programa y asegúrese de que no hay ningún error.Run the program, and ensure that there are no errors.

Recepción de eventosReceive events

En esta sección se muestra cómo escribir una aplicación de consola de .NET Core que reciba mensajes de un centro de eventos mediante el host de procesador 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. El host de procesador de eventos es una clase de .NET que simplifica la recepción de eventos desde Event Hubs mediante la administración de puntos de control persistentes y recepciones paralelas desde dichas instancias de Event Hubs.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. Mediante el host de procesador de eventos, puede dividir eventos entre varios receptores, aunque estén hospedados en distintos nodos.Using the Event Processor Host, you can split events across multiple receivers, even when hosted in different nodes. En este ejemplo se muestra cómo usar el host de procesador de eventos en un solo receptor.This example shows how to use the Event Processor Host for a single receiver.

Nota

Puede descargar esta guía de inicio rápido como un ejemplo desde GitHub, reemplazar las cadenas EventHubConnectionString y EventHubName, StorageAccountName, StorageAccountKey y StorageContainerName con los valores del centro de eventos y ejecutarlo.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. También puede seguir los pasos de este tutorial para crear el suyo propio.Alternatively, you can follow the steps in this tutorial to create your own.

Creación de una cuenta de almacenamiento para el host de procesador de eventosCreate a storage account for Event Processor Host

El host de procesador de eventos es un agente inteligente que simplifica la recepción de eventos desde Event Hubs mediante la administración de puntos de control persistentes y recepciones paralelas.The Event Processor Host is an intelligent agent that simplifies receiving events from Event Hubs by managing persistent checkpoints and parallel receives. Para los puntos de comprobación, el host de procesador de eventos requiere una cuenta de almacenamiento.For checkpointing, the Event Processor Host requires a storage account. El ejemplo siguiente muestra cómo crear una cuenta de almacenamiento y cómo obtener sus claves para el acceso:The following example shows how to create a storage account and how to get its keys for access:

  1. En Azure Portal, seleccione Crear un recurso en la parte superior izquierda de la pantalla.In the Azure portal, and select Create a resource at the top left of the screen.

  2. Seleccione Storage y, a continuación, seleccione Storage account - blob, file, table, queue (Cuenta de almacenamiento: blob, archivo, tabla, cola).Select Storage, then select Storage account - blob, file, table, queue.

    Seleccionar Cuenta de almacenamiento

  3. En la página Crear cuenta de almacenamiento, realice los pasos siguientes:On the Create storage account page, take the following steps:

    1. Escriba un nombre para la cuenta de almacenamiento.Enter a name for the storage account.

    2. Elija una suscripción de Azure que contenga el centro de eventos.Choose an Azure subscription that contains the event hub.

    3. Seleccione el grupo de recursos que tenga el centro de eventos.Select the resource group that has the event hub.

    4. Seleccione una ubicación en la que crear el recurso.Select a location in which to create the resource.

    5. Después, haga clic en Revisar + crear.Then click Review + create.

      Página Crear cuenta de almacenamiento

  4. En la página Revisar + crear, revise los valores y seleccione Crear.On the Review + create page, review the values, and select Create.

    Revisión de la configuración de la cuenta de almacenamiento y creación

  5. Una vez que aparezca el mensaje Implementaciones correctas, seleccione Ir al recurso en la parte superior de la página.After you see the Deployments Succeeded message, select Go to resource at the top of the page. También puede iniciar la página Cuenta de almacenamiento seleccionando la cuenta de almacenamiento en la lista de recursos.You can also launch the Storage Account page by selecting your storage account from the resource list.

    Selección de la cuenta de almacenamiento desde la implementación

  6. En la ventana Información esencial, haga clic en Blobs.In the Essentials window, select Blobs.

    Selección del servicio Blobs

  7. Seleccione + Contenedor en la parte superior, escriba un nombre para el contenedor y seleccione Aceptar.Select + Container at the top, enter a name for the container, and select OK.

    Creación de un contenedor de blobs

  8. Seleccione Claves de acceso en el menú de la izquierda y copie el valor de key1.Select Access keys in the left-side menu, and copy the value of key1.

    Guarde los valores siguientes en el Bloc de notas o en cualquier otra ubicación temporal.Save the following values to Notepad or some other temporary location.

    • Nombre de la cuenta de almacenamientoName of the storage account
    • Clave de acceso para la cuenta de almacenamientoAccess key for the storage account
    • Nombre del contenedorName of the container

Creación de una aplicación de consolaCreate a console application

Inicie Visual Studio.Start Visual Studio. En el menú Archivo, haga clic en Nuevo y en Proyecto.From the File menu, click New, and then click Project. Cree una aplicación de consola de .NET Core.Create a .NET Core console application.

Nuevo proyecto

Incorporación del paquete NuGet de Event HubsAdd the Event Hubs NuGet package

Agregue los paquetes NuGet de la biblioteca de .NET Standard Microsoft.Azure.EventHubs y Microsoft.Azure.EventHubs.Processor al proyecto mediante estos pasos:Add the Microsoft.Azure.EventHubs and Microsoft.Azure.EventHubs.Processor .NET Standard library NuGet packages to your project by following these steps:

  1. Haga clic con el botón derecho en el proyecto recién creado y seleccione Administrar paquetes NuGet.Right-click the newly created project and select Manage NuGet Packages.
  2. Haga clic en la pestaña Examinar, busque Microsoft.Azure.EventHubs y seleccione el paquete Microsoft.Azure.EventHubs.Click the Browse tab, search for Microsoft.Azure.EventHubs, and then select the Microsoft.Azure.EventHubs package. Haga clic en Instalar para completar la instalación y, a continuación, cierre este cuadro de diálogo.Click Install to complete the installation, then close this dialog box.
  3. Repita los pasos 1 y 2 e instale el paquete Microsoft.Azure.EventHubs.Processor.Repeat steps 1 and 2, and install the Microsoft.Azure.EventHubs.Processor package.

Implementación de la interfaz de IEventProcessorImplement the IEventProcessor interface

  1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto, haga clic en Agregar y después en Clase.In Solution Explorer, right-click the project, click Add, and then click Class. Asigne el nombre SimpleEventProcessor a la nueva clase.Name the new class SimpleEventProcessor.

  2. Abra el archivo SimpleEventProcessor.cs y agregue las siguientes instrucciones using en la parte superior del archivo.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. Implemente la interfaz IEventProcessor.Implement the IEventProcessor interface. Reemplace todo el contenido de la clase SimpleEventProcessor con el código siguiente: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();
        }
    }
    

Actualización del método Main para usar SimpleEventProcessorUpdate the Main method to use SimpleEventProcessor

  1. Agregue las siguientes instrucciones using al principio del archivo 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. Agregue constantes a la clase Program para la cadena de conexión del centro de eventos, el nombre del centro de eventos, el nombre del contenedor de la cuenta de almacenamiento, y el nombre de la cuenta de almacenamiento y la clave de la cuenta de almacenamiento.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. Agregue el código siguiente, reemplazando los marcadores de posición con sus valores correspondientes: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. Agregue un nuevo método denominado MainAsync a la clase Program, de esta manera: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. Agregue la siguiente línea de código al método Main:Add the following line of code to the Main method:

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

    Este es el aspecto que debería tener el archivo 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. Ejecute el programa y asegúrese de que no hay ningún error.Run the program, and ensure that there are no errors.

Pasos siguientesNext steps

Lea los siguientes artículos:Read the following articles: