Inicio rápido: Envío y recepción de mensajes de una cola de Azure Service Bus mediante (.NET)

En este inicio rápido, hará lo siguiente:

  1. Creación de un espacio de nombres de Service Bus mediante Azure Portal

  2. Creación de una cola de Service Bus mediante Azure Portal.

  3. Escribir una aplicación de consola de .NET para enviar un conjunto de mensajes a la cola.

  4. Escribir una aplicación de consola de .NET para recibir esos mensajes de la cola.

    Nota

    En este inicio rápido se proporcionan instrucciones paso a paso para implementar un escenario sencillo de envío de un lote de mensajes a una cola de Service Bus y la posterior recepción de estos. Para obtener información general sobre la biblioteca cliente de .NET, consulte Biblioteca cliente de Azure Service Bus para .NET. Para obtener más ejemplos, consulte los ejemplos de .NET de Service Bus en GitHub.

Prerrequisitos

Si no está familiarizado con el servicio, consulte la información general sobre Service Bus antes de seguir este artículo de inicio rápido.

  • Suscripción de Azure. Para usar los servicios de Azure, entre los que se incluye Azure Service Bus, se necesita una suscripción. Si no tiene una cuenta de Azure existente, puede registrarse para obtener una evaluación gratuita.
  • Visual Studio 2022. La aplicación de ejemplo utiliza las nuevas características que se introdujeron en C# 10. Todavía puede usar la biblioteca cliente de Service Bus con versiones anteriores del lenguaje C#, pero la sintaxis puede variar. Para usar la sintaxis más reciente, le recomendamos que instale .NET 6.0, o una versión posterior, y establezca la versión del lenguaje en latest. Si usa Visual Studio, las versiones anteriores a Visual Studio 2022 no son compatibles con las herramientas necesarias para compilar proyectos de C# 10.

Creación de un espacio de nombres en Azure Portal

Para empezar a usar entidades de mensajería de Service Bus en Azure, primero hay que crear un espacio de nombres con un nombre que sea único en Azure. Un espacio de nombres proporciona un contenedor de ámbito para los recursos de Service Bus (colas, temas, etc.) que están dentro de la aplicación.

Para crear un espacio de nombres:

  1. Inicie sesión en Azure Portal.

  2. Vaya a la páginaTodos los servicios.

  3. En la barra de navegación izquierda, seleccione Integration en la lista de categorías, mantenga el mouse sobre Service Bus, y a continuación, seleccione + botón en el mosaico de Service Bus.

    Image showing selection of Create a resource, Integration, and then Service Bus in the menu.

  4. En la pestaña Datos básicos de la página Crear espacio de nombres, siga estos pasos:

    1. En Suscripción, elija la suscripción de Azure en la que se va a crear el espacio de nombres.

    2. En Grupo de recursos, elija un grupo de recursos existente en el que residirá el espacio de nombres o cree uno.

    3. Escriba nombre para el espacio de nombres. El nombre del espacio de nombres debe cumplir las siguientes convenciones de nomenclatura:

      • El nombre debe ser único en Azure. El sistema realiza la comprobación automáticamente para ver si el nombre está disponible.
      • La longitud del nombre es de 6 caracteres como mínimo y 50 como máximo.
      • El nombre solo puede contener letras, números, guiones "-".
      • El nombre debe comenzar con una letra y terminar con una letra o un número.
      • El nombre no termina con "-sb" o "-mgmt".
    4. En Ubicación, elija la región donde se debe hospedar el espacio de nombres.

    5. En Plan de tarifa, seleccione el plan de tarifa (Básico, Estándar o Prémium) del espacio de nombres. Para este inicio rápido, seleccione Estándar.

      Importante

      Si desea usar temas y suscripciones, elija Estándar o Premium. El plan de tarifas Básico no admite temas o suscripciones.

      Si ha seleccionado el plan de tarifa Prémium, especifique el número de unidades de mensajería. El plan Premium proporciona aislamiento de recursos en el nivel de CPU y memoria para que cada carga de trabajo se ejecute de forma aislada. Este contenedor de recursos se llama unidad de mensajería. A cada espacio de nombres prémium se le asigna al menos una unidad de mensajería. Puede seleccionar 1, 2, 4, 8 o 16 unidades de mensajería para cada espacio de nombres prémium de Service Bus. Para más información, consulte Mensajería prémium de Service Bus.

    6. En la parte inferior de la página, seleccione Revisar y crear.

      Image showing the Create a namespace page

    7. En la página Revisar y crear, examine la configuración y seleccione Crear.

  5. Una vez que la implementación del recurso sea correcta, seleccione Ir al recurso en la página de implementación.

    Image showing the deployment succeeded page with the Go to resource link.

  6. Verá la página principal del espacio de nombres de Service Bus.

    Image showing the home page of the Service Bus namespace created.

Creación de colas en Azure Portal

  1. En la página Espacio de nombres de Service Bus, seleccione Colas en el menú de navegación izquierdo.

  2. En la página Colas, seleccione + Cola en la barra de herramientas.

  3. Escriba un nombre para la cola y deje los restantes valores con sus valores predeterminados.

  4. Ahora, seleccione Crear.

    Image showing creation of a queue in the portal

Importante

Si no está familiarizado con Azure, es posible que la opción de Cadena de conexión sea más fácil de seguir. Seleccione la pestaña Cadena de conexión para ver las instrucciones sobre el uso de una cadena de conexión en este inicio rápido. Se recomienda usar la opción Sin contraseña en entornos de producción y aplicaciones reales.

Autenticación de la aplicación en Azure

En este inicio rápido, se muestran dos maneras de conectarse a Azure Service Bus: sin contraseña y con la cadena de conexión.

La primera opción muestra cómo usar la entidad de seguridad en Microsoft Entra ID y el control de acceso basado en rol (RBAC) para conectarse a un espacio de nombres de Service Bus. No es necesario preocuparse por tener una cadena de conexión codificada de forma rígida en el código, en un archivo de configuración o en un almacenamiento seguro, como Azure Key Vault.

La segunda opción muestra cómo usar una cadena de conexión para conectarse a un espacio de nombres de Service Bus. Si no está familiarizado con Azure, puede que le resulte más fácil la opción de la cadena de conexión. Se recomienda usar la opción sin contraseña en aplicaciones reales y entornos de producción. Para más información, consulte Autenticación y autorización. También puede obtener más información sobre la autenticación sin contraseña en la página de información general.

Asignación de roles al usuario de Microsoft Entra

Al desarrollar localmente, asegúrese de que la cuenta de usuario que se conecta a Azure Service Bus tenga los permisos correctos. Necesitará el rol propietario de datos Azure Service Bus para enviar y recibir mensajes. Para asignarse este rol, necesitará el rol Administrador de accesos de usuarios, u otro que incluya la acción Microsoft.Authorization/roleAssignments/write. Puede asignar roles RBAC de Azure a un usuario mediante Azure Portal, la CLI de Azure o Azure PowerShell. Puede obtener más información sobre los ámbitos disponibles para las asignaciones de roles en la página de información general del ámbito.

En el ejemplo siguiente se asigna el rol Azure Service Bus Data Owner a la cuenta de usuario, que proporciona un acceso completo a los recursos de Azure Service Bus. En un escenario real, siga el Principio de privilegios mínimos para conceder a los usuarios solo los permisos mínimos necesarios para un entorno de producción más seguro.

Roles integrados de Azure para Azure Service Bus

En el caso de Azure Service Bus, la administración de los espacios de nombres y de todos los recursos relacionados mediante Azure Portal y la API de administración de recursos de Azure, ya se ha protegido mediante el modelo de Azure RBAC. Azure proporciona los siguientes roles integrados de Azure para autorizar el acceso a un espacio de nombres de Service Bus:

Si desea crear un rol personalizado, consulte Derechos necesarios para las operaciones de Service Bus.

Incorporación de un usuario de Microsoft Entra al rol Propietario de Azure Service Bus

Asigne el rol Propietario de datos de Azure Service Bus al nombre de usuario de Microsoft Entra en el nivel de espacio de nombres de Service Bus. Permitirá que una aplicación que se ejecuta en el contexto de la cuenta de usuario envíe mensajes a una cola o tema y reciba mensajes de la suscripción de una cola o tema.

Importante

En la mayoría de los casos, la asignación de roles tardará un minuto o dos en propagarse en Azure. En ocasiones excepcionales, puede tardar hasta ocho minutos. Si recibe errores de autenticación al ejecutar por primera vez el código, espere unos instantes e inténtelo de nuevo.

  1. Si no tiene abierta la página Espacio de nombres de Service Bus en Azure-Portal, busque el espacio de nombres de Service Bus mediante la barra de búsqueda principal o el panel de navegación izquierdo.

  2. En la página de información general, seleccione Control de acceso (IAM) en el menú de la izquierda.

  3. En la página Control de acceso (IAM), seleccione la pestaña Asignación de roles.

  4. Seleccione + Agregar en el menú superior y, a continuación, Agregar asignación de roles en el menú desplegable resultante.

    A screenshot showing how to assign a role.

  5. Puede usar el cuadro de búsqueda para filtrar los resultados por el rol deseado. En este ejemplo, busque Azure Service Bus Data Owner y seleccione el resultado coincidente. Después, haga clic en Siguiente.

  6. En la pestaña Asignar acceso a, seleccione Usuario, grupo o entidad de servicio y, a continuación, elija + Seleccionar miembros.

  7. En el cuadro de diálogo, busque el nombre de usuario de Microsoft Entra (normalmente su dirección de correo electrónico de user@domain) y, a continuación, elija Seleccionar en la parte inferior del cuadro de diálogo.

  8. Seleccione Revisar y asignar para ir a la página final y, a continuación, de nuevo Revisar y asignar para completar el proceso.

Inicio de Visual Studio e inicio de sesión en Azure

Puede autorizar el acceso al espacio de nombres de Service Bus siguiendo estos pasos:

  1. Inicie Visual Studio. Si aparece la ventana Introducción, seleccione el vínculo Continuar sin código en el panel derecho.

  2. Seleccione el botón Iniciar sesión en la parte superior derecha de Visual Studio.

    Screenshot showing a button to sign in to Azure using Visual Studio.

  3. Inicie sesión con la cuenta de Microsoft Entra a la que asignó un rol anteriormente.

    Screenshot showing the account selection.

Envío de mensajes a la cola

En esta sección se muestra cómo crear una aplicación de consola de .NET para enviar mensajes a una cola de Service Bus.

Nota

En este inicio rápido se proporcionan instrucciones paso a paso para implementar un escenario sencillo de envío de un lote de mensajes a una cola de Service Bus y la posterior recepción de estos. Para obtener más ejemplos sobre otros escenarios avanzados, vea los ejemplos de .NET de Service Bus en GitHub.

Creación de una aplicación de consola

  1. En Visual Studio, seleccione el menú Archivo ->Nuevo ->Proyecto.

  2. En el cuadro de diálogo Crear un nuevo proyecto, siga estos pasos: Si no ve este cuadro de diálogo, seleccione Archivo en el menú, seleccione Nuevo y, después, seleccione Proyecto.

    1. Seleccione C# como lenguaje de programación.

    2. Seleccione Consola como tipo de aplicación.

    3. Seleccione Aplicación de consola en la lista de resultados.

    4. Después, seleccione Siguiente.

      Image showing the Create a new project dialog box with C# and Console selected

  3. Escriba QueueSender como nombre del proyecto, ServiceBusQueueQuickStart como nombre de la solución y, a continuación, seleccione Siguiente.

    Image showing the solution and project names in the Configure your new project dialog box

  4. En la página Información adicional, seleccione Crear para crear la solución y el proyecto.

Agregar los paquetes de NuGet al proyecto

  1. Seleccione Herramientas>Administrador de paquetes NuGet>Consola del Administrador de paquetes en el menú.

  2. Ejecute el siguiente comando para instalar el paquete NuGet Azure.Messaging.ServiceBus.

    Install-Package Azure.Messaging.ServiceBus
    
  3. Ejecute el siguiente comando para instalar el paquete NuGet Azure.Identity.

    Install-Package Azure.Identity
    

Incorporación de código para enviar mensajes a la cola

  1. Reemplace el contenido de Program.cs por el código siguiente. Los pasos importantes se describen en la siguiente sección, con información adicional en los comentarios de código.

    Importante

    Actualice los valores de marcador de posición (<NAMESPACE-NAME> y <QUEUE-NAME>) en el fragmento de código con los nombres del espacio de nombres y la cola de Service Bus.

    using Azure.Messaging.ServiceBus;
    using Azure.Identity;
    
    // name of your Service Bus queue
    // the client that owns the connection and can be used to create senders and receivers
    ServiceBusClient client;
    
    // the sender used to publish messages to the queue
    ServiceBusSender sender;
    
    // number of messages to be sent to the queue
    const int numOfMessages = 3;
    
    // The Service Bus client types are safe to cache and use as a singleton for the lifetime
    // of the application, which is best practice when messages are being published or read
    // regularly.
    //
    // Set the transport type to AmqpWebSockets so that the ServiceBusClient uses the port 443. 
    // If you use the default AmqpTcp, ensure that ports 5671 and 5672 are open.
    var clientOptions = new ServiceBusClientOptions
    { 
        TransportType = ServiceBusTransportType.AmqpWebSockets
    };
    //TODO: Replace the "<NAMESPACE-NAME>" and "<QUEUE-NAME>" placeholders.
    client = new ServiceBusClient(
        "<NAMESPACE-NAME>.servicebus.windows.net",
        new DefaultAzureCredential(),
        clientOptions);
    sender = client.CreateSender("<QUEUE-NAME>");
    
    // create a batch 
    using ServiceBusMessageBatch messageBatch = await sender.CreateMessageBatchAsync();
    
    for (int i = 1; i <= numOfMessages; i++)
    {
        // try adding a message to the batch
        if (!messageBatch.TryAddMessage(new ServiceBusMessage($"Message {i}")))
        {
            // if it is too large for the batch
            throw new Exception($"The message {i} is too large to fit in the batch.");
        }
    }
    
    try
    {
        // Use the producer client to send the batch of messages to the Service Bus queue
        await sender.SendMessagesAsync(messageBatch);
        Console.WriteLine($"A batch of {numOfMessages} messages has been published to the queue.");
    }
    finally
    {
        // Calling DisposeAsync on client types is required to ensure that network
        // resources and other unmanaged objects are properly cleaned up.
        await sender.DisposeAsync();
        await client.DisposeAsync();
    }
    
    Console.WriteLine("Press any key to end the application");
    Console.ReadKey();
    
  2. Compile el proyecto y asegúrese de que no hay errores.

  3. Ejecute el programa y espere el mensaje de confirmación.

    A batch of 3 messages has been published to the queue
    

    Importante

    En la mayoría de los casos, la asignación de roles tardará un minuto o dos en propagarse en Azure. En raras ocasiones, puede tardar hasta ocho minutos. Si recibe errores de autenticación al ejecutar por primera vez el código, espere unos instantes e inténtelo de nuevo.

  4. En Azure Portal, haga lo siguiente:

    1. Vaya al espacio de nombres de Service Bus.

    2. En la página Información general, seleccione la cola en el panel inferior central.

      Image showing the Service Bus Namespace page in the Azure portal with the queue selected.

    3. Observe los valores en la sección Información esencial.

      Image showing the number of messages received and the size of the queue.

    Observe los valores siguientes:

    • El valor del recuento de mensajes Activos de la cola ahora es 3. Cada vez que se ejecuta la aplicación de remitente sin recuperar los mensajes, este valor aumenta en 3.
    • El tamaño actual de la cola aumenta cada vez que la aplicación agrega mensajes a la misma.
    • En el gráfico Mensajes de la sección Métricas inferior, puede ver que hay tres mensajes entrantes para la cola.

Recepción de mensajes de la cola

En esta sección, crea una aplicación de consola de .NET que recibe mensajes de la cola.

Nota:

En este inicio rápido se proporcionan instrucciones paso a paso para implementar un escenario de envío de un lote de mensajes a una cola de Service Bus y la posterior recepción de estos. Para obtener más ejemplos sobre otros escenarios avanzados, vea los ejemplos de .NET de Service Bus en GitHub.

Creación de un proyecto para el destinatario

  1. En la ventana del Explorador de soluciones, haga clic con el botón derecho en la solución ServiceBusQueueQuickStart, haga clic en Agregar y seleccione Nuevo proyecto.
  2. Seleccione Aplicación de consola y elija Siguiente.
  3. Escriba QueueReceiver en Nombre de proyecto y seleccione Crear.
  4. En la ventana del Explorador de soluciones, haga clic con el botón derecho en QueueReceiver y seleccione Set as a Startup Project (Establecer como proyecto de inicio).

Agregar los paquetes de NuGet al proyecto

  1. Seleccione Herramientas>Administrador de paquetes NuGet>Consola del Administrador de paquetes en el menú.

  2. Seleccione QueueReceiver en Proyecto predeterminado.

    Screenshot showing QueueReceiver project selected in the Package Manager Console.

  3. Ejecute el comando siguiente para instalar el paquete NuGet Azure.Messaging.ServiceBus.

    Install-Package Azure.Messaging.ServiceBus
    
  4. Ejecute el siguiente comando para instalar el paquete NuGet Azure.Identity.

    Install-Package Azure.Identity
    

Adición del código para recibir mensajes de la cola

En esta sección agregará código para recuperar mensajes de la cola.

  1. En la clase Program, agregue el siguiente código:

    using System.Threading.Tasks;
    using Azure.Identity;
    using Azure.Messaging.ServiceBus;
    
    // the client that owns the connection and can be used to create senders and receivers
    ServiceBusClient client;
    
    // the processor that reads and processes messages from the queue
    ServiceBusProcessor processor;
    
  2. Anexe los siguientes métodos al final de la clase Program.

    // handle received messages
    async Task MessageHandler(ProcessMessageEventArgs args)
    {
        string body = args.Message.Body.ToString();
        Console.WriteLine($"Received: {body}");
    
        // complete the message. message is deleted from the queue. 
        await args.CompleteMessageAsync(args.Message);
    }
    
    // handle any errors when receiving messages
    Task ErrorHandler(ProcessErrorEventArgs args)
    {
        Console.WriteLine(args.Exception.ToString());
        return Task.CompletedTask;
    }
    
  3. Anexe el siguiente código al final de la clase Program. Los pasos importantes se describen en la siguiente sección, con información adicional en los comentarios de código.

    • Crea un objeto ServiceBusClient mediante el objeto DefaultAzureCredential. DefaultAzureCredential detecta y usa automáticamente las credenciales del inicio de sesión de Visual Studio para autenticarse en Azure Service Bus.
    • Invoca al método CreateProcessor en el objeto ServiceBusClient para crear un objeto ServiceBusProcessor para la cola de Service Bus especificada.
    • Especifica los controladores para los eventos ProcessMessageAsync y ProcessErrorAsync del objeto ServiceBusProcessor.
    • Inicia el procesamiento de mensajes; para ello, invoca el método StartProcessingAsync en el objeto ServiceBusProcessor.
    • Cuando el usuario presiona una tecla para finalizar el procesamiento, invoca el método StopProcessingAsync en el objeto ServiceBusProcessor.

    Importante

    Actualice los valores de marcador de posición (<NAMESPACE-NAME> y <QUEUE-NAME>) en el fragmento de código con los nombres del espacio de nombres y la cola de Service Bus.

    // The Service Bus client types are safe to cache and use as a singleton for the lifetime
    // of the application, which is best practice when messages are being published or read
    // regularly.
    //
    // Set the transport type to AmqpWebSockets so that the ServiceBusClient uses port 443. 
    // If you use the default AmqpTcp, make sure that ports 5671 and 5672 are open.
    
    // TODO: Replace the <NAMESPACE-NAME> placeholder
    var clientOptions = new ServiceBusClientOptions()
    {
        TransportType = ServiceBusTransportType.AmqpWebSockets
    };
    client = new ServiceBusClient(
        "<NAMESPACE-NAME>.servicebus.windows.net",
        new DefaultAzureCredential(),
        clientOptions);
    
    // create a processor that we can use to process the messages
    // TODO: Replace the <QUEUE-NAME> placeholder
    processor = client.CreateProcessor("<QUEUE-NAME>", new ServiceBusProcessorOptions());
    
    try
    {
        // add handler to process messages
        processor.ProcessMessageAsync += MessageHandler;
    
        // add handler to process any errors
        processor.ProcessErrorAsync += ErrorHandler;
    
        // start processing 
        await processor.StartProcessingAsync();
    
        Console.WriteLine("Wait for a minute and then press any key to end the processing");
        Console.ReadKey();
    
        // stop processing 
        Console.WriteLine("\nStopping the receiver...");
        await processor.StopProcessingAsync();
        Console.WriteLine("Stopped receiving messages");
    }
    finally
    {
        // Calling DisposeAsync on client types is required to ensure that network
        // resources and other unmanaged objects are properly cleaned up.
        await processor.DisposeAsync();
        await client.DisposeAsync();
    }
    
  4. La clase completada Program debe coincidir con el siguiente código:

    using System.Threading.Tasks;
    using Azure.Messaging.ServiceBus;
    using Azure.Identity;
    
    // the client that owns the connection and can be used to create senders and receivers
    ServiceBusClient client;
    
    // the processor that reads and processes messages from the queue
    ServiceBusProcessor processor;
    
    // The Service Bus client types are safe to cache and use as a singleton for the lifetime
    // of the application, which is best practice when messages are being published or read
    // regularly.
    //
    // Set the transport type to AmqpWebSockets so that the ServiceBusClient uses port 443.
    // If you use the default AmqpTcp, make sure that ports 5671 and 5672 are open.
    
    // TODO: Replace the <NAMESPACE-NAME> and <QUEUE-NAME> placeholders
    var clientOptions = new ServiceBusClientOptions() 
    {
        TransportType = ServiceBusTransportType.AmqpWebSockets
    };
    client = new ServiceBusClient("<NAMESPACE-NAME>.servicebus.windows.net", 
        new DefaultAzureCredential(), clientOptions);
    
    // create a processor that we can use to process the messages
    // TODO: Replace the <QUEUE-NAME> placeholder
    processor = client.CreateProcessor("<QUEUE-NAME>", new ServiceBusProcessorOptions());
    
    try
    {
        // add handler to process messages
        processor.ProcessMessageAsync += MessageHandler;
    
        // add handler to process any errors
        processor.ProcessErrorAsync += ErrorHandler;
    
        // start processing 
        await processor.StartProcessingAsync();
    
        Console.WriteLine("Wait for a minute and then press any key to end the processing");
        Console.ReadKey();
    
        // stop processing 
        Console.WriteLine("\nStopping the receiver...");
        await processor.StopProcessingAsync();
        Console.WriteLine("Stopped receiving messages");
    }
    finally
    {
        // Calling DisposeAsync on client types is required to ensure that network
        // resources and other unmanaged objects are properly cleaned up.
        await processor.DisposeAsync();
        await client.DisposeAsync();
    }
    
    // handle received messages
    async Task MessageHandler(ProcessMessageEventArgs args)
    {
        string body = args.Message.Body.ToString();
        Console.WriteLine($"Received: {body}");
    
        // complete the message. message is deleted from the queue. 
        await args.CompleteMessageAsync(args.Message);
    }
    
    // handle any errors when receiving messages
    Task ErrorHandler(ProcessErrorEventArgs args)
    {
        Console.WriteLine(args.Exception.ToString());
        return Task.CompletedTask;
    }
    
  5. Compile el proyecto y asegúrese de que no hay errores.

  6. Ejecute la aplicación del destinatario. Debería ver los mensajes recibidos. Presione cualquier tecla para detener el receptor y la aplicación.

    Wait for a minute and then press any key to end the processing
    Received: Message 1
    Received: Message 2
    Received: Message 3
    
    Stopping the receiver...
    Stopped receiving messages
    
  7. Vuelva a consultar el portal. Espere unos minutos y actualice la página si no ve 0 para los mensajes Activos.

    • El recuento de mensajes Activos y los valores de Tamaño actual ahora son 0.

    • En el gráfico Mensajes de la sección Métricas inferior, puede ver que hay tres mensajes entrantes y otros tres salientes para la cola.

      Screenshot showing active messages and size after receive.

Limpieza de recursos

Vaya al espacio de nombres de Service Bus en Azure Portal y seleccione Eliminar para eliminar el espacio de nombres y la cola que hay en él.

Consulte también

Consulte la documentación y los ejemplos siguientes:

Pasos siguientes