Partilhar via


Tutorial: Usar integrações de mensagens .NET Aspire no ASP.NET Core

Os aplicativos nativos da nuvem geralmente exigem soluções de mensagens escaláveis que forneçam recursos como filas, tópicos e assinaturas de mensagens. .NET Aspire integrações simplificam o processo de conexão com vários provedores de mensagens, como Azure Service Bus. Neste tutorial, você criará um aplicativo ASP.NET Core que usa integrações .NET Aspire para se conectar ao Azure Service Bus para criar um sistema de notificação. As mensagens submetidas serão enviadas para um tópico do Service Bus para consumo pelos assinantes. Você aprenderá a:

  • Criar um aplicativo .NET básico configurado para usar integrações .NET Aspire
  • Adicione uma integração .NET Aspire para se conectar ao Azure Service Bus
  • Configurar e usar .NET.NET Aspire recursos de integração para enviar e receber dados

Pré-requisitos

Para trabalhar com .NET.NET Aspire, você precisa do seguinte instalado localmente:

Para obter mais informações, consulte .NETconfiguração e ferramentas.NET Aspire, e .NET.NET Aspire SDK.

Além dos pré-requisitos anteriores, você também precisa instalar a CLI Azure. Para instalar a CLI do Azure, siga as instruções no guia de instalação do Azure.

Configurar a conta Azure Service Bus

Para este tutorial, você precisará acessar um namespace Azure Service Bus com um tópico e uma assinatura configurados. Use uma das seguintes opções para configurar os recursos necessários:

Alternativamente:

  • Azure CLI: Execute os seguintes comandos na CLI Azure ou no CloudShell para configurar os recursos necessários de Azure Service Bus:

    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
    

    Observação

    Substitua os espaços reservados nome-do-grupo-de-recursos e nome-do-espaço-de-nomes pelos seus próprios valores. Os nomes de namespace do Barramento de Serviço devem ser globalmente exclusivos em todo Azure.

Azure autenticação

Este início rápido pode ser concluído usando autenticação sem senha ou uma cadeia de conexão. As conexões sem senha usam Azure Ative Directory e RBAC (controle de acesso baseado em função) para se conectar a um namespace do Service Bus. Você não precisa se preocupar em ter uma cadeia de conexão codificada em seu código, em um arquivo de configuração ou em armazenamento seguro, como Azure Key Vault.

Você também pode usar uma cadeia de conexão para se conectar a um namespace do Service Bus, mas a abordagem sem senha é recomendada para aplicativos do mundo real e ambientes de produção. Para obter mais informações, leia sobre autenticação e autorização ou visite a página de visão geral sobre o conceito "sem senha" .

No namespace do Service Bus, atribua a seguinte função à conta de usuário na qual você fez login Visual Studio ou à CLI Azure:

Criar a solução de exemplo

Para criar um novo aplicativo .NET Aspire Starter, você pode usar Visual Studio, Visual Studio Codeou a CLI .NET.

Visual Studio fornece .NET Aspire modelos que lidam com algumas configurações iniciais de instalação para você. Conclua as seguintes etapas para criar um projeto para este início rápido:

  1. No topo de Visual Studio, navegue até Arquivo>Novo>Projeto.

  2. Na janela de diálogo, procure por Aspire e selecione .NET.NET Aspire Starter App. Selecione Avançar.

    Um screenshot do modelo .NET.NET Aspire Starter App.

  3. Na tela Configurar seu novo projeto:

    • Insira um Nome do Projeto de AspireSample.
    • Deixe a rest dos valores em seus padrões e selecione Avançar.
  4. Na tela de Informações adicionais:

    • Certifique-se de que .NET 9.0 (Suporte de Termo Padrão) esteja selecionado.
    • Verifique se Usar Redis para cache (requer um tempo de execução de contêiner suportado) está marcada e selecione Criar.
    • Opcionalmente, você pode selecionar Criar um projeto de testes. Para obter mais informações, consulte Escreva seu primeiro teste de .NET.NET Aspire.

Visual Studio cria uma nova solução estruturada para utilizar .NET Aspire.

Visual Studio Code fornece modelos de projeto .NET Aspire que cuidam de algumas configurações iniciais para você. Conclua as seguintes etapas para criar um projeto para este início rápido:

  1. Em uma nova instância do Visual Studio Code (sem uma pasta aberta), selecione o botão Criar projeto .NET.

  2. Selecione o modelo .NET.NET Aspire Starter App.

    Uma captura de tela do modelo .NET.NET Aspire Starter App.

Se você ainda não instalou os modelos de .NET.NET Aspire, execute o seguinte comando dotnet new install:

dotnet new install Aspire.ProjectTemplates

O comando .NET CLI anterior garante que você tenha os modelos .NET Aspire disponíveis. Para criar o .NET.NET Aspire Starter App a partir do modelo, execute o seguinte comando dotnet new:

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

Para obter mais informações, consulte dotnet new. A CLI .NET cria uma nova solução estruturada para usar .NET Aspire.

Adicionar o projeto Worker Service

Em seguida, adicione um projeto Worker Service à solução para recuperar e processar mensagens de e para Azure Service Bus.

  1. No explorador de soluções, clique com o botão direito do rato no nó de AspireSample solução de nível superior e selecione Adicionar>Novo Projeto.
  2. Pesquise e selecione o modelo Worker Service e escolha Avançar.
  3. Para o nome do projeto , digite AspireSample.WorkerService e selecione Next.
  4. No ecrã de Informações adicionais:
    • Certifique-se de .NET 9.0 está selecionado.
    • Verifique se Inscrição na .NET.NET Aspire de orquestração está marcada e selecione Criar.

Visual Studio adiciona o projeto à sua solução e atualiza o arquivo de Program.cs do projeto AspireSample.AppHost com uma nova linha de código:

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

Visual Studio ferramentas adicionaram essa linha de código para registrar seu novo projeto com o objeto IDistributedApplicationBuilder, o que permite recursos de orquestração que você explorará mais tarde.

  1. No Explorador de Soluções no Visual Studio Code, selecione o botão + ao lado do nome da solução para adicionar um novo projeto à solução:

    Visual Studio Code: Adicione um novo projeto do C# DevKit Solution Explorer.

  2. Para filtrar os modelos de projeto, digite Worker na caixa de pesquisa e selecione o modelo encontrado Worker Service.

    Visual Studio Code: Filtre para Worker Service modelo de projeto a partir do Adicionar projeto.

  3. Escolha o modelo Worker Service e insira o nome do projeto como AspireSample.WorkerService.

  4. Selecione de diretório padrão para criar o projeto no mesmo diretório da solução.

  5. Selecione Criar projeto para adicionar o projeto à solução.

  6. Clique com o botão direito do rato no projeto AspireSample.AppHost no Solution Explorer e selecione Adicionar Referência ao Projeto:

    Visual Studio Code: Adicione referência de projeto de AspireSample.AppHost para AspireSample.WorkerService.

  7. Adicione a seguinte linha de código ao arquivo no projeto AspireSample.AppHost antes da chamada para :

    builder.AddProject<Projects.AspireSample_WorkerService>(
        "aspiresample-workerservice");
    
  1. No diretório raiz do aplicativo, use o comando dotnet new para criar um novo aplicativo Worker Service:

    dotnet new worker --name AspireSample.WorkerService
    
  2. Use o comando dotnet sln para adicionar o projeto à solução:

    dotnet sln AspireSample.sln add AspireSample.WorkerService/AspireSample.WorkerService.csproj
    
  3. Use o comando dotnet add para adicionar uma referência de projeto entre os projetos .AppHost e .WorkerService.

    dotnet add AspireSample.AppHost/AspireSample.AppHost.csproj reference AspireSample.WorkerService/AspireSample.WorkerService.csproj
    
  4. Adicione a seguinte linha de código ao arquivo no projeto AspireSample.AppHost antes da chamada para :

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

A estrutura da solução concluída deve ser semelhante à seguinte, supondo que o diretório de nível superior seja nomeado 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

Adicionar a integração .NET.NET Aspire à API

Adicione a integração .NET Aspire Azure Service Bus à sua app AspireSample.ApiService:

  1. No Solution Explorer, clique duas vezes no arquivo AspireSample.ApiService.csproj para abrir seu arquivo XML.

  2. Adicione o seguinte item <PackageReference> ao elemento <ItemGroup>:

    <ItemGroup>
        <PackageReference Include="Aspire.Azure.Messaging.ServiceBus"
                          Version="8.0.1" />
    </ItemGroup>
    
  1. No Gerenciador de Soluções, clique com o botão direito do mouse no projeto AspireSample.ApiService e selecione Adicionar pacote NuGet:

    Visual Studio Code: Adicione o pacote NuGet ao projeto AspireSample.ApiService.

  2. Digite Aspire.Azure. Messaging.ServiceBus na caixa de pesquisa e selecione o pacote na lista.

  3. Selecione a (mais recente) versão para instalar o pacote.

dotnet add package Aspire.Azure.Messaging.ServiceBus

No arquivo Program.cs do projeto AspireSample.ApiService, adicione uma chamada ao método de extensão AddAzureServiceBusClient — substituindo a chamada existente para AddServiceDefaults:

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

Para obter mais informações, consulte AddAzureServiceBusClient.

Este método realiza as seguintes tarefas:

  • Registra um ServiceBusClient com o contêiner DI para conexão com Azure Service Bus.
  • Permite automaticamente verificações de integridade, registro em log e telemetria correspondentes para os respetivos serviços.

No arquivo appsettings.json do mesmo projeto, adicione as informações de conexão correspondentes:

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

Observação

Certifique-se de substituir {your_namespace} nos URIs de serviço pelo nome do seu próprio namespace do Service Bus.

Criar o endpoint da API

A interface de programação de aplicações (API) deve fornecer um ponto de extremidade para receber dados, publicá-los no tópico do Service Bus e transmiti-los aos assinantes. Adicione o seguinte endpoint ao projeto AspireSample.ApiService para enviar uma mensagem ao tópico do Service Bus. Substitua todo o conteúdo do arquivo Program.cs pelo seguinte código 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();

Adicione a integração .NET Aspire ao Worker Service

Adicione a integração .NET Aspire Azure Service Bus ao seu projeto AspireSample.WorkerService. Siga os mesmos passos que fez antes quando adicionou o pacote NuGet Aspire.Azure.Messaging.ServiceBus no projeto AspireSample.ApiService. Depois de adicionado, você pode configurar o serviço de trabalho para processar mensagens do tópico Service Bus.

No arquivo Program.cs do projeto AspireSample.WorkerService, substitua o código existente com o seguinte:

using AspireSample.WorkerService;

var builder = Host.CreateApplicationBuilder(args);

builder.AddAzureServiceBusClient("serviceBusConnection");

builder.Services.AddHostedService<Worker>();

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

O método AddAzureServiceBusClient realiza as seguintes tarefas:

  • Registra um ServiceBusClient com o contêiner DI para conexão com Azure Service Bus.
  • Permite automaticamente verificações de integridade, registro em log e telemetria correspondentes para os respetivos serviços.

No arquivo appsettings.json do projeto AspireSample.WorkerService, adicione as informações de conexão correspondentes.

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

Observação

Certifique-se de substituir {your_namespace} nos URIs de serviço pelo nome do seu próprio namespace do Service Bus.

Processar a mensagem do assinante

Quando uma nova mensagem é colocada na fila de messages, o serviço de trabalho deve recuperar, processar e excluir a mensagem. Atualize a classe Worker.cs para corresponder ao seguinte código:

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;
    }
}

Executar e testar o aplicativo localmente

O aplicativo de exemplo agora está pronto para teste. Verifique se os dados enviados para a API são enviados para o tópico Azure Service Bus e consumidos pelo serviço de trabalhador assinante:

  1. Inicie o projeto .NET.NET Aspire selecionando o botão Iniciar debug ou pressionando F5. O aplicativo de painel .NET.NET Aspire deve ser aberto no navegador.
  1. Inicie o projeto .NET.NET Aspire selecionando o botão Iniciar depuração ou pressionando F5. O aplicativo de painel .NET.NET Aspire deve ser aberto no navegador.
  1. Inicie o projeto .NET.NET Aspire executando dotnet run --project AspireSample.AppHost. O aplicativo de painel .NET.NET Aspire deve ser aberto no navegador.
  1. Na página de recursos, na linha apiservice, localize o link nos Endpoints que abre o endpoint weatherforecast. Observe o número da porta HTTPS.

  2. No painel .NET.NET Aspire, navegue até aos logs do projeto aspiresample-workerservice.

  3. Em uma janela de terminal, use o comando curl para enviar uma mensagem de teste para a API:

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

    Certifique-se de substituir {port} pelo número da porta anterior.

  4. Volte para os logs de aspiresample-workerservice. Você deve ver a mensagem de teste impressa nos logs de saída.

Parabéns;! Você criou e configurou uma API ASP.NET Core que se conecta a Azure Service Bus usando integrações Aspire.

Limpar recursos

Execute o seguinte comando Azure CLI para excluir o grupo de recursos quando não precisar mais dos recursos Azure criados. A exclusão do grupo de recursos também exclui os recursos contidos nele.

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

Para obter mais informações, consulte Limpar recursos no Azure.