Compartir a través de


Tutorial: Uso de integraciones de mensajería de .NET Aspire en ASP.NET Core

Las aplicaciones nativas de nube suelen requerir soluciones de mensajería escalables que proporcionan funcionalidades como colas de mensajería y temas y suscripciones. Las integraciones de .NET Aspire simplifican el proceso de conexión a varios proveedores de mensajería, como Azure Service Bus. En este tutorial, creará una aplicación de ASP.NET Core que usa integraciones de .NET Aspire para conectarse a Azure Service Bus para crear un sistema de notificaciones. Los mensajes enviados se enviarán a un tema de Service Bus para ser consumidos por los suscriptores. Aprenderá a:

  • Creación de una aplicación de .NET básica que esté configurada para usar integraciones de .NET Aspire
  • Añade una integración de .NET Aspire para conectarse con Azure Service Bus
  • Configuración y uso de características de integración de .NET.NET Aspire para enviar y recibir datos

Prerrequisitos

Para trabajar con .NET.NET Aspire, necesita lo siguiente instalado localmente:

Para obtener más información, consulte configuración y herramientas de .NET.NET Aspirey sdk de .NET.NET Aspire.

Además de los requisitos previos anteriores, también debe instalar la CLI de Azure. Para instalar la CLI de Azure, siga las instrucciones de la guía de instalación de la CLI de Azure.

Configuración de la cuenta de Azure Service Bus

Para este tutorial, necesitará acceso a un espacio de nombres de Azure Service Bus con un tema y una suscripción ya configurados. Use una de las siguientes opciones para configurar los recursos necesarios:

Alternativamente:

  • Azure CLI: ejecute los siguientes comandos en la CLI de Azure o CloudShell para configurar los recursos Azure Service Bus necesarios:

    az group create -n <your-resource-group-name> --location eastus
    az servicebus namespace create -g <your-resource-group-name> --name <your-namespace-name> --location eastus
    az servicebus topic create -g <your-resource-group-name> --namespace-name <your-namespace-name> --name notifications
    az servicebus topic subscription create -g <your-resource-group-name> --namespace-name <your-namespace-name> --topic-name notifications --name mobile
    

    Nota

    Reemplace los marcadores de posición your-resource-group-name y your-namespace-name por sus propios valores. Los nombres de espacio de nombres de Service Bus deben ser globalmente únicos en Azure.

autenticación de Azure

Este inicio rápido se puede completar mediante la autenticación sin contraseña o una cadena de conexión. Las conexiones sin contraseña usan Azure Active Directory 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, un archivo de configuración o en un almacenamiento seguro, como Azure Key Vault.

También puede usar una cadena de conexión para conectarse a un espacio de nombres de Service Bus, pero se recomienda el enfoque sin contraseña para aplicaciones y entornos de producción reales. Para obtener más información, lea sobre de autenticación y autorización o visite la página de información general de sin contraseña.

En el espacio de nombres de Service Bus, asigne el siguiente rol a la cuenta de usuario con el que inició sesión en Visual Studio o en la CLI de Azure.

  • Propietario de datos de Service Bus: Asignar un rol RBAC de Azure

Creación de la solución de ejemplo

Para crear una nueva aplicación de inicio de .NET Aspire, puede usar Visual Studio, Visual Studio Codeo la CLI de .NET.

Visual Studio proporciona plantillas de .NET Aspire que manejan algunas configuraciones iniciales por ti. Complete los pasos siguientes para crear un proyecto para este inicio rápido:

  1. En la parte superior de Visual Studio, vaya a Archivo>Nuevo>Proyecto.

  2. En la ventana de diálogo, busque Aspire y seleccione .NET.NET Aspire Aplicación de inicio. Seleccione Siguiente.

    Captura de pantalla de la plantilla de aplicación de inicio de .NET.NET Aspire.

  3. En la pantalla Configurar tu nuevo proyecto:

    • Escriba un nombre de proyecto de AspireSample.
    • Deje el rest de los valores en sus valores predeterminados y seleccione Siguiente.
  4. En la pantalla de información adicional :

    • Asegúrese de que .NET 9.0 (Compatibilidad con Términos Estándar) esté seleccionado.
    • Asegúrese de que use Redis para el almacenamiento en caché (requiere un entorno de ejecución de contenedor compatible) esté activada y seleccione Crear.
    • Opcionalmente, puede seleccionar Crear un proyecto de pruebas. Para obtener más información, consulte Escribir la primera prueba de .NET.NET Aspire.

Visual Studio crea una nueva solución estructurada para usar .NET Aspire.

Visual Studio Code ofrece .NET Aspire plantillas de proyecto que gestionan algunas configuraciones iniciales. Complete los pasos siguientes para crear un proyecto para este inicio rápido:

  1. En una nueva instancia de Visual Studio Code (sin una carpeta abierta), seleccione el botón Crear proyecto de .NET.

  2. Seleccione la plantilla .NET.NET Aspire Starter App.

    Captura de pantalla de la plantilla de aplicación de inicio de .NET.NET Aspire.

Si aún no ha instalado las plantillas de .NET.NET Aspire, ejecute el siguiente comando dotnet new install:

dotnet new install Aspire.ProjectTemplates

El comando CLI .NET anterior garantiza que tiene las plantillas .NET Aspire disponibles. Para crear la aplicación de inicio de .NET.NET Aspire a partir de la plantilla, ejecute el siguiente comando dotnet new:

dotnet new aspire-starter --use-redis-cache --output AspireSample

Para obtener más información, consulte dotnet new. La CLI de .NET crea una nueva solución estructurada para usar .NET Aspire.

Añadir el proyecto Worker Service

A continuación, agregue un proyecto de Worker Service a la solución para recuperar y procesar mensajes hacia y desde Azure Service Bus.

  1. En el Explorador de soluciones, haga clic con el botón derecho en el nodo de solución de nivel superior AspireSample y seleccione Agregar>Nuevo proyecto.
  2. Busque y seleccione la plantilla de Worker Service y elija Siguiente.
  3. Para el nombre del proyecto , escriba AspireSample.WorkerService y seleccione Siguiente.
  4. En la pantalla Información adicional:
    • Asegúrese de que .NET 9.0 esté seleccionado.
    • Asegúrese de que Enlist in .NET.NET Aspire orquestación esté activada y seleccione Crear.

Visual Studio agrega el proyecto a la solución y actualiza el archivo Program.cs del proyecto de AspireSample.AppHost con una nueva línea de código:

builder.AddProject<Projects.AspireSample_WorkerService>(
    "aspiresample-workerservice");

El conjunto de herramientas Visual Studio agregó esta línea de código para registrar tu nuevo proyecto con el objeto IDistributedApplicationBuilder, lo que habilita las funciones de orquestación que explorarás más adelante.

  1. En el del Explorador de soluciones de en , seleccione el botón situado junto al nombre de la solución para agregar un nuevo proyecto a la solución:

    Visual Studio Code: agregue un nuevo proyecto desde el Explorador de soluciones de C# DevKit.

  2. Para filtrar las plantillas de proyecto, escriba Worker en el cuadro de búsqueda y seleccione la plantilla Worker Service que se encuentra:

    Visual Studio Code: filtrar para la plantilla de proyecto Worker Service desde Agregar proyecto.

  3. Elija la plantilla Worker Service y escriba el nombre del proyecto como AspireSample.WorkerService.

  4. Seleccione directorio predeterminado para crear el proyecto en el mismo directorio que la solución.

  5. Seleccione Crear proyecto para agregar el proyecto a la solución.

  6. Haga clic con el botón derecho en el proyecto AspireSample.AppHost en el Explorador de soluciones y seleccione Agregar referencia de proyecto:

    Visual Studio Code: agregue la referencia de proyecto de AspireSample.AppHost a AspireSample.WorkerService.

  7. Agregue la siguiente línea de código al archivo Program.cs en el proyecto de AspireSample.AppHost antes de la llamada a builder.Build().Run();:

    builder.AddProject<Projects.AspireSample_WorkerService>(
        "aspiresample-workerservice");
    
  1. En el directorio raíz de la aplicación, use el comando dotnet new para crear una nueva aplicación de Worker Service:

    dotnet new worker --name AspireSample.WorkerService
    
  2. Use el comando dotnet sln para agregar el proyecto a la solución:

    dotnet sln AspireSample.sln add AspireSample.WorkerService/AspireSample.WorkerService.csproj
    
  3. Use el comando dotnet add para agregar una referencia de proyecto entre el proyecto .AppHost y el proyecto .WorkerService.

    dotnet add AspireSample.AppHost/AspireSample.AppHost.csproj reference AspireSample.WorkerService/AspireSample.WorkerService.csproj
    
  4. Agregue la siguiente línea de código al archivo Program.cs en el proyecto de AspireSample.AppHost antes de la llamada a builder.Build().Run();:

    builder.AddProject<Projects.AspireSample_WorkerService>(
        "aspiresample-workerservice");
    

La estructura de solución completada debe ser similar a la siguiente, suponiendo que el directorio de nivel superior se denomina aspire-messaging:

└───📂 aspire-messaging
     ├───📂 AspireSample.WorkerService
     │    ├───📂 Properties
     │    │    └─── launchSettings.json
     │    ├─── appsettings.Development.json
     │    ├─── appsettings.json
     │    ├─── AspireSample.WorkerService.csproj
     │    ├─── Program.cs
     │    └─── Worker.cs
     ├───📂 AspireSample.ApiService
     │    ├───📂 Properties
     │    │    └─── launchSettings.json
     │    ├─── appsettings.Development.json
     │    ├─── appsettings.json
     │    ├─── AspireSample.ApiService.csproj
     │    └─── Program.cs
     ├───📂 AspireSample.AppHost
     │    ├───📂 Properties
     │    │    └─── launchSettings.json
     │    ├─── appsettings.Development.json
     │    ├─── appsettings.json
     │    ├─── AspireSample.AppHost.csproj
     │    └─── Program.cs
     ├───📂 AspireSample.ServiceDefaults
     │    ├─── AspireSample.ServiceDefaults.csproj
     │    └─── Extensions.cs
     ├───📂 AspireSample.Web
     │    ├───📂 Components
     │    │    ├───📂 Layout
     │    │    │    ├─── MainLayout.razor
     │    │    │    ├─── MainLayout.razor.css
     │    │    │    ├─── NavMenu.razor
     │    │    │    └─── NavMenu.razor.css
     │    │    ├───📂 Pages
     │    │    │    ├─── Counter.razor
     │    │    │    ├─── Error.razor
     │    │    │    ├─── Home.razor
     │    │    │    └─── Weather.razor
     │    │    ├─── _Imports.razor
     │    │    ├─── App.razor
     │    │    └─── Routes.razor
     │    ├───📂 Properties
     │    │    └─── launchSettings.json
     │    ├───📂 wwwroot
     │    │    ├───📂 bootstrap
     │    │    │    ├─── bootstrap.min.css
     │    │    │    └─── bootstrap.min.css.map
     │    │    ├─── app.css
     │    │    └─── favicon.png
     │    ├─── appsettings.Development.json
     │    ├─── appsettings.json
     │    ├─── AspireSample.Web.csproj
     │    ├─── Program.cs
     │    └─── WeatherApiClient.cs
     └─── AspireSample.sln

Incorporación de la integración de .NET.NET Aspire a la API

Agregue la integración de .NET Aspire Azure Service Bus a su aplicación AspireSample.ApiService.

  1. En el explorador de soluciones de , haga doble clic en el archivo AspireSample.ApiService.csproj para abrir su archivo XML.

  2. Agregue el siguiente elemento <PackageReference> al elemento <ItemGroup>:

    <ItemGroup>
        <PackageReference Include="Aspire.Azure.Messaging.ServiceBus"
                          Version="8.0.1" />
    </ItemGroup>
    
  1. En el Explorador de Soluciones, haga clic con el botón derecho en el proyecto AspireSample.ApiService y seleccione Agregar paquete NuGet:

    Visual Studio Code: agregue el paquete NuGet al proyecto AspireSample.ApiService.

  2. Escriba Aspire.Azure. Messaging.ServiceBus en el cuadro de búsqueda y seleccione el paquete de la lista.

  3. Seleccione la versión de (más reciente) para instalar el paquete.

dotnet add package Aspire.Azure.Messaging.ServiceBus

En el archivo Program.cs del proyecto AspireSample.ApiService, agregue una llamada al método de extensión AddAzureServiceBusClient, reemplazando la llamada existente a AddServiceDefaults.

// Add service defaults & Aspire integrations.
builder.AddServiceDefaults();
builder.AddAzureServiceBusClient("serviceBusConnection");

Para obtener más información, consulte AddAzureServiceBusClient.

Este método realiza las siguientes tareas:

  • Registra un ServiceBusClient con el contenedor de DI para la conexión con Azure Service Bus.
  • Habilita automáticamente las comprobaciones de estado, el registro y la telemetría correspondientes para los servicios respectivos.

En el archivo appsettings.json del mismo proyecto, agregue la información de conexión correspondiente:

{
  // Existing configuration is omitted for brevity.
  "ConnectionStrings": {
    "serviceBusConnection": "{your_namespace}.servicebus.windows.net"
  }
}

Nota

Asegúrese de reemplazar {your_namespace} en los URI de servicio por el nombre de su propio espacio de nombres de Service Bus.

Creación del punto de conexión de API

La API debe proporcionar un punto de conexión para recibir datos y publicarlos en el tema de Service Bus y difundirlos a los suscriptores. Agregue el siguiente punto de conexión al proyecto de AspireSample.ApiService para enviar un mensaje al tema de Service Bus. Reemplace todo el contenido del archivo Program.cs por el siguiente código de C#:

using Azure.Messaging.ServiceBus;

var builder = WebApplication.CreateBuilder(args);

// Add service defaults & Aspire integrations.
builder.AddServiceDefaults();
builder.AddAzureServiceBusClient("serviceBusConnection");

// Add services to the container.
builder.Services.AddProblemDetails();

var app = builder.Build();

// Configure the HTTP request pipeline.
app.UseExceptionHandler();

app.MapPost("/notify", static async (ServiceBusClient client, string message) =>
{
    var sender = client.CreateSender("notifications");

    // Create a batch
    using ServiceBusMessageBatch messageBatch =
        await sender.CreateMessageBatchAsync();

    if (messageBatch.TryAddMessage(
            new ServiceBusMessage($"Message {message}")) is false)
    {
        // If it's too large for the batch.
        throw new Exception(
            $"The message {message} is too large to fit in the batch.");
    }

    // Use the producer client to send the batch of
    // messages to the Service Bus topic.
    await sender.SendMessagesAsync(messageBatch);

    Console.WriteLine($"A message has been published to the topic.");
});

app.MapDefaultEndpoints();

app.Run();

Agregue la integración de .NET Aspire al Worker Service

Agregue la integración de .NET Aspire Azure Service Bus al proyecto de AspireSample.WorkerService. Siga los mismos pasos que siguió antes al agregar el paquete NuGet Aspire.Azure. Messaging.ServiceBus al proyecto AspireSample.ApiService. Una vez agregado, puede configurar el servicio de trabajo para procesar mensajes del tema de Service Bus.

En el archivo Program.cs del proyecto de AspireSample.WorkerService, reemplace el código existente con lo siguiente:

using AspireSample.WorkerService;

var builder = Host.CreateApplicationBuilder(args);

builder.AddAzureServiceBusClient("serviceBusConnection");

builder.Services.AddHostedService<Worker>();

var host = builder.Build();
host.Run();

El método AddAzureServiceBusClient realiza las siguientes tareas:

  • Registra un ServiceBusClient con el contenedor DI para conectarse a Azure Service Bus.
  • Habilita automáticamente las comprobaciones de estado, el registro y la telemetría correspondientes para los servicios respectivos.

En el archivo appsettings.json del proyecto de AspireSample.WorkerService, agregue la información de conexión correspondiente:

{
  // Existing configuration is omitted for brevity.
  "ConnectionStrings": {
    "serviceBusConnection": "{your_namespace}.servicebus.windows.net"
  }
}

Nota

Asegúrese de reemplazar {your_namespace} en los URI de servicio por el nombre de su propio espacio de nombres de Service Bus.

Procesar el mensaje del suscriptor

Cuando se coloca un nuevo mensaje en la cola de messages, el servicio de trabajo debe recuperar, procesar y eliminar el mensaje. Actualice la clase Worker.cs para que coincida con el código siguiente:

using Azure.Messaging.ServiceBus;

namespace AspireSample.WorkerService;

public sealed class Worker(
    ILogger<Worker> logger,
    ServiceBusClient client) : BackgroundService
{
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            var processor = client.CreateProcessor(
                "notifications",
                "mobile",
                new ServiceBusProcessorOptions());

            // Add handler to process messages
            processor.ProcessMessageAsync += MessageHandler;

            // Add handler to process any errors
            processor.ProcessErrorAsync += ErrorHandler;

            // Start processing
            await processor.StartProcessingAsync();

            logger.LogInformation("""
                Wait for a minute and then press any key to end the processing
                """);

            Console.ReadKey();

            // Stop processing
            logger.LogInformation("""

                Stopping the receiver...
                """);

            await processor.StopProcessingAsync();

            logger.LogInformation("Stopped receiving messages");
        }
    }

    async Task MessageHandler(ProcessMessageEventArgs args)
    {
        string body = args.Message.Body.ToString();

        logger.LogInformation("Received: {Body} from subscription.", body);

        // Complete the message. messages is deleted from the subscription.
        await args.CompleteMessageAsync(args.Message);
    }

    // Handle any errors when receiving messages
    Task ErrorHandler(ProcessErrorEventArgs args)
    {
        logger.LogError(args.Exception, "{Error}", args.Exception.Message);
        
        return Task.CompletedTask;
    }
}

Ejecución y prueba local de la aplicación

La aplicación de ejemplo ya está lista para las pruebas. Compruebe que los datos enviados a la API se envían al tema de Azure Service Bus y los consume el servicio de trabajo del suscriptor:

  1. Inicie el proyecto de seleccionando el botón Iniciar depuración de o presionando F5. La aplicación de panel de control .NET.NET Aspire debería abrirse en el explorador.
  1. Inicie el proyecto de seleccionando el botón Iniciar depuración de o presionando F5. La aplicación del panel de control .NET.NET Aspire debe abrirse en el explorador.
  1. Inicie el proyecto de .NET.NET Aspire ejecutando dotnet run --project AspireSample.AppHost. La aplicación del panel .NET.NET Aspire debe abrirse en el navegador.
  1. En la página de recursos, en la fila de apiservice , busque el enlace en los puntos de conexión que abre el endpoint weatherforecast. Anote el número de puerto HTTPS.

  2. En el panel de .NET.NET Aspire, vaya a los registros del proyecto de aspiresample-workerservice.

  3. En una ventana de terminal, use el comando curl para enviar un mensaje de prueba a la API:

    curl -X POST -H "Content-Type: application/json" https://localhost:{port}/notify?message=hello%20aspire  
    

    Asegúrese de reemplazar {port} por el número de puerto anterior.

  4. Vuelva a los registros de aspiresample-workerservice. Debería ver el mensaje de prueba impreso en los registros de salida.

¡Felicidades! Ha creado y configurado una API de ASP.NET Core que se conecta a Azure Service Bus mediante integraciones de Aspire.

Limpieza de recursos

Ejecute el siguiente comando Azure CLI para eliminar el grupo de recursos cuando ya no necesite los recursos de Azure que creó. Al eliminar el grupo de recursos también se eliminan los recursos contenidos en él.

az group delete --name <your-resource-group-name>

Para obtener más información, consulte Limpieza de recursos en Azure.