다음을 통해 공유


자습서: ASP.NET Core 앱을 .NET Aspire 스토리지 통합에 연결

클라우드 네이티브 앱에는 Blob Storage, 큐 또는 반구조화된 NoSQL 데이터베이스와 같은 기능을 제공하는 확장 가능한 스토리지 솔루션이 필요한 경우가 많습니다. .NET Aspire 통합은 Azure Blob Storage같은 다양한 스토리지 서비스에 대한 연결을 간소화합니다. 이 자습서에서는 ASP.NET Core 통합을 사용하여 .NET Aspire와 Azure Blob Storage Queue Storage에 연결하고 지원 티켓을 제출하는 Azure 앱을 만듭니다. 앱은 처리를 위해 티켓을 큐로 보내고 첨부 파일을 스토리지에 업로드합니다. 방법을 배우게 됩니다.

  • .NET 통합을 사용하도록 설정된 기본 .NET Aspire 앱 만들기
  • .NET .NET Aspire 통합을 추가하여 여러 스토리지 서비스에 연결
  • .NET .NET Aspire 구성 요소 기능을 구성하고 사용하여 데이터를 보내고 받습니다.

필수 구성 요소

.NET .NET Aspire작업하려면 다음을 로컬에 설치해야 합니다.

자세한 내용은 .NET.NET Aspire 설정 및 도구.NET.NET Aspire SDK참조하세요.

완료된 샘플 앱 살펴보기

이 자습서를 통해 완성된 샘플 애플리케이션의 버전은 GitHub에서 사용할 수 있습니다. 또한 프로젝트는 Azure Developer CLI용 템플릿으로 구성됩니다. 즉, 도구 azd up에 설치되어 있다면, Azure 명령을 사용하여 리소스 프로비저닝을 자동화할 수 있습니다.

git clone https://github.com/Azure-Samples/dotnet-aspire-connect-storage.git

Azure Storage 리소스 설정

이 문서에서는 Blob 컨테이너와 스토리지 큐가 포함된 Azure Storage 계정의 데이터 기여자 접근 권한이 필요합니다. 다음 리소스 및 구성을 사용할 수 있는지 확인합니다.

이 문서에서는 에뮬레이터를 사용하여 로컬 개발 환경에서 Blob 컨테이너 및 스토리지 큐 리소스를 만들어야 합니다. 이렇게 하려면 Azurite를 사용합니다. Azurite는 무료 오픈 소스 플랫폼 간 Azure Storage API 호환 server 에뮬레이터로, Docker 컨테이너에서 실행됩니다.

에뮬레이터를 사용하려면 Azurite를 설치해야 합니다.

  1. Azure Storage 계정 - 스토리지 계정만듭니다.
  2. Blob Storage 컨테이너 fileuploads - 가 있습니다. Blob Storage 컨테이너를 만드십시오.
  3. 티켓이라는 스토리지 큐 - 를 포함하여 스토리지 큐만들기.

Azure CLI 또는 CloudShell에서 다음 명령을 실행하여 필요한 Azure Storage 리소스를 설정합니다.

az group create --name aspirestorage --location eastus2
az storage account create -n aspirestorage -g aspirestorage -l eastus2
az storage container create -n fileuploads --account-name aspirestorage
az storage queue create -n tickets --account-name aspirestorage

또한 당신이 Visual Studio으로 로그인한 사용자 계정으로 다음 역할을 할당해야 합니다.

  • Storage Blob 데이터 기여자 - RBAC 역할 할당
  • 스토리지 큐 데이터 기여자 - Azure RBAC 역할 할당

Azure Developer CLI 템플릿 시스템을 사용하여 Azure 리소스를 프로비전하고 배포할 수 있습니다. 이 자습서에서는 필요한 리소스를 프로비전하고 완성된 샘플 애플리케이션 코드를 포함하는 Azure 제공합니다. 다음 명령을 실행하여 템플릿을 초기화하고 실행합니다.

  1. azd auth login을 실행하여 Azure에 로그인합니다.

    azd auth login
    
  2. azd init 실행하여 샘플 템플릿을 복제하고 초기화합니다.

    azd init --template dotnet-aspire-connect-storage
    
  3. azd up 실행하여 Azure 리소스를 프로비전합니다.

    azd up
    
  4. 메시지가 표시되면 프로비전된 리소스에 대한 구독 및 Azure 지역을 선택합니다. 템플릿이 실행되고 다음 작업을 완료합니다.

    • Blob 및 큐 서비스를 사용하도록 설정된 Azure Storage 계정을 만듭니다.
    • fileUploads이라는 Blob Storage 컨테이너를 만듭니다.
    • tickets이라는 이름의 큐를 만듭니다.
    • 템플릿을 실행한 사용자 계정에 다음 역할을 할당합니다.
      • Storage Blob 데이터 기여자
      • 스토리지 큐 데이터 기여자

작업이 성공적으로 완료되면, 앞으로 진행할 두 가지 옵션이 있습니다.

  • 옵션 1: 템플릿 .NET 디렉터리에서 src 샘플 앱을 실행하여 완료된 앱을 실험합니다.
  • 옵션 2: 앞의 섹션을 사용하여 샘플 앱을 단계별로 빌드하고 Azure프로비전된 azd 리소스에 연결합니다.

샘플 솔루션 만들기

.NET Aspire 또는 Visual Studio CLI를 사용하여 .NET 프로젝트를 만듭니다.

  1. Visual Studio의 맨 위에서 파일>>프로젝트로 이동합니다.
  2. 대화 상자 창에서 Aspire 검색하고 .NET.NET Aspire 시작 애플리케이션선택합니다. 선택한 다음.
  3. 새 프로젝트 구성 화면에서 다음을 수행합니다.
    • 솔루션 이름AspireStorage에서 입력하고, 다음을 선택합니다.
  4. 추가 정보 화면에서 다음을 수행합니다.
    • Redis 캐싱에 사용(이 자습서에는 필요하지 않음)을 선택 취소합니다.
    • 선택합니다만들기.

Visual Studio는 ASP.NET Core를 사용하도록 구조화된 새 .NET Aspire 솔루션을 만듭니다.

솔루션은 다음 프로젝트로 구성됩니다.

  • AspireStorage.ApiService - 기본 .NET.NET Aspire 서비스 구성이 있는 API 프로젝트입니다.
  • AspireStorage.AppHost - 앱의 다양한 프로젝트와 서비스를 연결하고 구성하도록 설계된 오케스트레이터 프로젝트입니다. 오케스트레이터는 시작 프로젝트로 설정해야 합니다.
  • AspireStorage.ServiceDefaults - 솔루션의 프로젝트에서 다시 사용할 수 있는 코드를 보관하는 공유 클래스 라이브러리입니다.
  • AspireStorage.Web - 앱의 프런트 엔드 역할을 하는 BlazorServer 프로젝트입니다.

Worker Service 프로젝트 추가

다음으로, Worker Service 프로젝트를 솔루션에 추가하여 Azure Storage 큐에 추가되는 메시지를 검색하고 처리합니다.

  1. 솔루션 탐색기에서 최상위 수준의 AspireStorage 솔루션 노드를 마우스 오른쪽 버튼으로 클릭하고 추가>새 프로젝트을 선택합니다.
  2. 템플릿을 검색하여 선택하고 다음선택합니다.
  3. 프로젝트 이름AspireStorage.WorkerService 입력하고 다음를 선택합니다.
  4. 추가 정보 화면에서 다음을 수행합니다.
    • .NET 9.0 선택되어 있는지 확인합니다.
    • .NET .NET Aspire 오케스트레이션 에서 인리스트가 선택되어 있는지 확인하고 만들기를 선택합니다.

Visual Studio 솔루션에 프로젝트를 추가하고 Program.cs 프로젝트의 파일을 새 코드 줄로 업데이트합니다.

builder.AddProject<Projects.AspireStorage_WorkerService>(
    "aspirestorage-workerservice");

Visual Studio 도구는 오케스트레이션 기능을 사용하도록 설정하는 IDistributedApplicationBuilder 개체에 새 프로젝트를 등록하기 위해 이 코드 줄을 추가했습니다. 자세한 내용은 .NET.NET Aspire 오케스트레이션 개요참조하세요.

완성된 솔루션 구조는 다음과 유사합니다.

.NET.NET Aspire 스토리지 샘플 솔루션의 구조를 보여 주는 스크린샷

.NET Aspire 앱에 Blazor 통합 추가

.NET Aspire 프로젝트에 .NET Aspire 및 Azure Queue Storage 통합 패키지를 추가합니다.

dotnet add package Aspire.Azure.Storage.Blobs
dotnet add package Aspire.Azure.Storage.Queues

이제 AspireStorage.Web 프로젝트가 .NET.NET Aspire 통합을 사용하도록 설정되었습니다. 업데이트된 AspireStorage.Web.csproj 파일은 다음과 같습니다.

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net9.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference Include="..\AspireStorage.ServiceDefaults\AspireStorage.ServiceDefaults.csproj" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="Aspire.Azure.Storage.Blobs" Version="9.0.0" />
    <PackageReference Include="Aspire.Azure.Storage.Queues" Version="9.0.0" />
  </ItemGroup>

</Project>

다음 단계는 앱에 통합을 추가하는 것입니다.

Program.cs 프로젝트의 파일에서 AddAzureBlobClient를 생성한 후, AddAzureQueueClient을 호출하기 전에 builderAddServiceDefaults 확장 메서드를 추가하십시오. 자세한 내용은 .NET.NET Aspire 서비스 기본값참조하세요. 연결 문자열의 이름을 매개 변수로 제공합니다.

using AspireStorage.Web;
using AspireStorage.Web.Components;

using Azure.Storage.Blobs;
using Azure.Storage.Queues;

var builder = WebApplication.CreateBuilder(args);

builder.AddAzureBlobClient("BlobConnection");
builder.AddAzureQueueClient("QueueConnection");

// Add service defaults & Aspire components.
builder.AddServiceDefaults();

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

builder.Services.AddOutputCache();

builder.Services.AddHttpClient<WeatherApiClient>(client =>
    {
        // This URL uses "https+http://" to indicate HTTPS is preferred over HTTP.
        // Learn more about service discovery scheme resolution at https://aka.ms/dotnet/sdschemes.
        client.BaseAddress = new("https+http://apiservice");
    });

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error", createScopeForErrors: true);
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}
else
{
    // In development, create the blob container and queue if they don't exist.
    var blobService = app.Services.GetRequiredService<BlobServiceClient>();
    var docsContainer = blobService.GetBlobContainerClient("fileuploads");

    await docsContainer.CreateIfNotExistsAsync();

    var queueService = app.Services.GetRequiredService<QueueServiceClient>();
    var queueClient = queueService.GetQueueClient("tickets");

    await queueClient.CreateIfNotExistsAsync();
}

app.UseHttpsRedirection();

app.UseStaticFiles();
app.UseAntiforgery();

app.UseOutputCache();

app.MapRazorComponents<App>()
    .AddInteractiveServerRenderMode();

app.MapDefaultEndpoints();

app.Run();
using AspireStorage.Web;
using AspireStorage.Web.Components;

using Azure.Storage.Blobs;
using Azure.Storage.Queues;

var builder = WebApplication.CreateBuilder(args);

builder.AddAzureBlobClient("BlobConnection");
builder.AddAzureQueueClient("QueueConnection");

// Add service defaults & Aspire components.
builder.AddServiceDefaults();

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

builder.Services.AddOutputCache();

builder.Services.AddHttpClient<WeatherApiClient>(client =>
    {
        // This URL uses "https+http://" to indicate HTTPS is preferred over HTTP.
        // Learn more about service discovery scheme resolution at https://aka.ms/dotnet/sdschemes.
        client.BaseAddress = new("https+http://apiservice");
    });

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error", createScopeForErrors: true);
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseStaticFiles();
app.UseAntiforgery();

app.UseOutputCache();

app.MapRazorComponents<App>()
    .AddInteractiveServerRenderMode();

app.MapDefaultEndpoints();

app.Run();

추가 using 문을 사용하여 이러한 메서드는 다음 작업을 수행합니다.

AspireStorage.Web 프로젝트가 시작되면 Azurite Blob Storage에 fileuploads 컨테이너를 만들고, Azurite Queue Storage에 tickets 큐를 생성합니다. 앱이 개발 환경에서 실행되는 경우 조건부입니다. 앱이 프로덕션 환경에서 실행 중인 경우 컨테이너 및 큐는 이미 만들어진 것으로 간주됩니다.

.NET Aspire을 Worker Service에 통합 추가

작업자 서비스는 처리를 위해 Azure Storage 큐에서 메시지를 끌어옵니다. .NET Aspire Azure Queue Storage를 AspireStorage.WorkerService 앱에 통합하기 위한 패키지를 추가합니다.

dotnet add package Aspire.Azure.Storage.Queues

Program.cs 프로젝트의 파일에서 AddAzureQueueClient 만든 후 builder호출하기 전에 AddServiceDefaults 확장 메서드에 대한 호출을 추가합니다.

using AspireStorage.WorkerService;

var builder = Host.CreateApplicationBuilder(args);

builder.AddAzureQueueClient("QueueConnection");

builder.AddServiceDefaults();
builder.Services.AddHostedService<WorkerService>();

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

이 메서드는 다음 작업을 처리합니다.

  • QueueServiceClient에 연결하기 위한 목적으로 DI 컨테이너에 Azure Storage Queues를 등록합니다.
  • 해당 서비스에 대해 해당 상태 검사, 로깅 및 원격 분석을 자동으로 사용하도록 설정합니다.

양식 만들기

앱에는 사용자가 지원 티켓 정보를 제출하고 첨부 파일을 업로드할 수 있는 양식이 필요합니다. 앱은 첨부된 파일을 삽입된 Document을 사용하여 IFormFile(Azure Blob Storage) 속성에서 BlobServiceClient로 업로드합니다. QueueServiceClientTitleDescription로 구성된 메시지를 Azure Storage 큐로 보냅니다.

다음 Razor 마크업을 사용하여 기본 양식을 만들고 AspireStorage.Web/Components/Pages 디렉터리에 있는 Home.razor 파일의 내용을 바꿉니다.

@page "/"

@using System.ComponentModel.DataAnnotations
@using Azure.Storage.Blobs
@using Azure.Storage.Queues

@inject BlobServiceClient BlobClient
@inject QueueServiceClient QueueServiceClient

<PageTitle>Home</PageTitle>

<div class="text-center">
    <h1 class="display-4">Request Support</h1>
</div>

<EditForm Model="@Ticket" FormName="Tickets" method="post"
          OnValidSubmit="@HandleValidSubmit" enctype="multipart/form-data">
    <DataAnnotationsValidator />
    <ValidationSummary />

    <div class="mb-4">
        <label>Issue Title</label>
        <InputText class="form-control" @bind-Value="@Ticket.Title" />
        <ValidationMessage For="() => Ticket.Title" />
    </div>
    <div class="mb-4">
        <label>Issue Description</label>
        <InputText class="form-control" @bind-Value="@Ticket.Description" />
        <ValidationMessage For="() => Ticket.Description" />
    </div>
    <div class="mb-4">
        <label>Attachment</label>
        <InputFile class="form-control" name="Ticket.Document" />
        <ValidationMessage For="() => Ticket.Document" />
    </div>
    <button class="btn btn-primary" type="submit">Submit</button>
    <button class="btn btn-danger mx-2" type="reset" @onclick=@ClearForm>Clear</button>
</EditForm>

@code {
    [SupplyParameterFromForm(FormName = "Tickets")]
    private SupportTicket Ticket { get; set; } = new();

    private async Task HandleValidSubmit()
    {
        var docsContainer = BlobClient.GetBlobContainerClient("fileuploads");

        // Upload file to blob storage
        await docsContainer.UploadBlobAsync(
            Ticket.Document.FileName,
            Ticket.Document.OpenReadStream());

        // Send message to queue
        var queueClient = QueueServiceClient.GetQueueClient("tickets");

        await queueClient.SendMessageAsync(
             $"{Ticket.Title} - {Ticket.Description}");

        ClearForm();
    }

    private void ClearForm() => Ticket = new();

    private class SupportTicket()
    {
        [Required] public string Title { get; set; } = default!;
        [Required] public string Description { get; set; } = default!;
        [Required] public IFormFile Document { get; set; } = default!;
    }
}

Blazor양식을 만드는 방법에 대한 자세한 내용은 ASP.NET CoreBlazor 양식 개요참조하세요.

AppHost 업데이트

AspireStorage.AppHost 프로젝트는 귀하의 앱을 위한 오케스트레이터입니다. 앱의 다양한 프로젝트와 서비스를 연결하고 구성하는 역할을 담당합니다. 오케스트레이터는 시작 프로젝트로 설정해야 합니다.

Azure IDistributedApplicationBuilder Storage 호스팅 지원을 추가하려면 📦Aspire설치합니다. 호스팅.Azure. 스토리지 NuGet 패키지입니다.

dotnet add package Aspire.Hosting.Azure.Storage

Program.cs 프로젝트의 파일 내용을 다음 코드로 바꿉니다.

using Microsoft.Extensions.Hosting;

var builder = DistributedApplication.CreateBuilder(args);

var storage = builder.AddAzureStorage("Storage");

if (builder.Environment.IsDevelopment())
{
    storage.RunAsEmulator();
}

var blobs = storage.AddBlobs("BlobConnection");
var queues = storage.AddQueues("QueueConnection");

var apiService = builder.AddProject<Projects.AspireStorage_ApiService>("apiservice");

builder.AddProject<Projects.AspireStorage_Web>("webfrontend")
    .WithExternalHttpEndpoints()
    .WithReference(apiService)
    .WithReference(blobs)
    .WithReference(queues); 

builder.AddProject<Projects.AspireStorage_WorkerService>("aspirestorage-workerservice")
    .WithReference(queues);

builder.Build().Run();

앞의 코드는 Azure 스토리지, Blob 및 큐를 추가하고 개발 모드에서는 에뮬레이터를 사용합니다. 각 프로젝트는 이러한 리소스에 대한 참조를 정의합니다.

using Microsoft.Extensions.Hosting;

var builder = DistributedApplication.CreateBuilder(args);

var storage = builder.AddAzureStorage("Storage");

var blobs = storage.AddBlobs("BlobConnection");
var queues = storage.AddQueues("QueueConnection");

var apiService = builder.AddProject<Projects.AspireStorage_ApiService>("apiservice");

builder.AddProject<Projects.AspireStorage_Web>("webfrontend")
    .WithExternalHttpEndpoints()
    .WithReference(apiService)
    .WithReference(blobs)
    .WithReference(queues); 

builder.AddProject<Projects.AspireStorage_WorkerService>("aspirestorage-workerservice")
    .WithReference(queues);

builder.Build().Run();

앞의 코드는 Azure 스토리지, Blob 및 큐를 추가하고 해당 리소스에 종속된 각 프로젝트 내에서 이러한 리소스에 대한 참조를 정의합니다.

큐의 항목을 처리하세요

새 메시지가 tickets 큐에 배치되면 작업자 서비스는 메시지를 검색, 처리 및 삭제해야 합니다. Worker.cs 클래스를 업데이트하고 내용을 다음 코드로 바꿉니다.

using Azure.Storage.Queues;
using Azure.Storage.Queues.Models;

namespace AspireStorage.WorkerService;

public sealed class WorkerService(
    QueueServiceClient client,
    ILogger<WorkerService> logger) : BackgroundService
{
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        var queueClient = client.GetQueueClient("tickets");
        await queueClient.CreateIfNotExistsAsync(cancellationToken: stoppingToken);

        while (!stoppingToken.IsCancellationRequested)
        {
            QueueMessage[] messages =
                await queueClient.ReceiveMessagesAsync(
                    maxMessages: 25, cancellationToken: stoppingToken);

            foreach (var message in messages)
            {
                logger.LogInformation(
                    "Message from queue: {Message}", message.MessageText);

                await queueClient.DeleteMessageAsync(
                    message.MessageId,
                    message.PopReceipt,
                    cancellationToken: stoppingToken);
            }

            // TODO: Determine an appropriate time to wait 
            // before checking for more messages.
            await Task.Delay(TimeSpan.FromSeconds(15), stoppingToken);
        }
    }
}

작업자 서비스가 메시지를 처리하려면 Azure Storage 큐에 연결할 수 있어야 합니다. Azurite를 사용할 때, 작업자 서비스가 메시지 큐 처리를 시작하기 전에 큐가 사용 가능한지 확인해야 합니다.

using Azure.Storage.Queues;
using Azure.Storage.Queues.Models;

namespace AspireStorage.WorkerService;

public sealed class WorkerService(
    QueueServiceClient client,
    ILogger<WorkerService> logger) : BackgroundService
{
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        var queueClient = client.GetQueueClient("tickets");
        while (!stoppingToken.IsCancellationRequested)
        {
            QueueMessage[] messages =
                await queueClient.ReceiveMessagesAsync(
                    maxMessages: 25, cancellationToken: stoppingToken);

            foreach (var message in messages)
            {
                logger.LogInformation(
                    "Message from queue: {Message}", message.MessageText);

                await queueClient.DeleteMessageAsync(
                    message.MessageId,
                    message.PopReceipt,
                    cancellationToken: stoppingToken);
            }

            // TODO: Determine an appropriate time to wait 
            // before checking for more messages.
            await Task.Delay(TimeSpan.FromSeconds(15), stoppingToken);
        }
    }
}

작업자 서비스는 Azure Storage 큐에 연결하여 큐에서 메시지를 끌어와 처리합니다.

작업자 서비스는 큐의 메시지를 처리하고 나면 이를 삭제합니다.

연결 문자열 구성

AspireStorageAspireStorage.Worker 프로젝트는 이전에 만든 올바른 Azure Storage 계정에 연결하도록 구성해야 합니다. 각 프로젝트의 appsettings.json 파일을 사용하여 스토리지 계정의 Blob 및 큐 서비스에 대한 엔드포인트를 지정할 수 있습니다.

  1. AspireStorage 프로젝트에서 appsettings.Development.json 파일에 다음 구성을 추가합니다.

      "ConnectionStrings": {
        "BlobConnection": "https://<your-storage-account-name>.blob.core.windows.net/",
        "QueueConnection": "https://<your-storage-account-name>.queue.core.windows.net/"
      }
    
  2. AspireStorage.Worker 프로젝트에서 appsettings.Development.json 파일에 다음 구성을 추가합니다.

      "ConnectionStrings": {
        "QueueConnection": "https://<your-storage-account-name>.queue.core.windows.net/"
      }
    

로컬에서 앱 실행 및 테스트

이제 샘플 앱이 테스트할 준비가 되었습니다. 다음 단계를 완료하여 제출된 양식 데이터가 Azure Blob Storage 및 Azure Queue Storage로 전송되는지 확인합니다.

  1. Visual Studio 맨 위에 있는 실행 단추를 눌러 브라우저에서 .NET Aspire 프로젝트 대시보드를 시작합니다.

  2. 리소스 페이지의 aspirestorage.web 행에서 엔드포인트 열의 링크를 클릭하여 앱의 UI를 엽니다.

    .NET.NET Aspire 지원 애플리케이션의 홈페이지를 보여 주는 스크린샷

  3. TitleDescription 양식 필드에 샘플 데이터를 입력하고, 업로드할 간단한 파일을 선택합니다.

  4. 제출 버튼을 클릭하면, 양식이 처리를 위해 지원 티켓을 제출하고 양식을 삭제합니다.

  5. 별도의 브라우저 탭에서 Azure 포털을 사용하여 Storage 계정의 Azure로 이동합니다.

  6. 컨테이너 선택한 다음 문서 컨테이너로 이동하여 업로드된 파일을 확인합니다.

  7. 큐의 메시지가 처리되었는지 확인하려면 .NET Aspire에서 Project 로그을 확인하고, 드롭다운에서 aspirestorage.workerservice을 선택하십시오.

    작업자 앱의 콘솔 출력을 보여 주는 스크린샷입니다.

요약

빌드한 예제 앱은 ASP.NET CoreBlazor Web App에서 Blob을 지속하고 .NET Worker Service큐를 처리하는 방법을 보여 줍니다. 앱은 Azure 통합을 사용하여 .NET Aspire Storage에 연결합니다. 앱은 처리를 위해 지원 티켓을 큐로 보내고 첨부 파일을 스토리지에 업로드합니다.

Azurite를 사용하도록 선택했으므로 에뮬레이터의 컨텍스트에서 로컬로 만들었으므로 테스트를 완료하면 이러한 리소스를 정리할 필요가 없습니다. 에뮬레이터를 사용하면 Azure 리소스가 프로비전되거나 생성되지 않으므로 비용이 발생하지 않고 로컬에서 앱을 테스트할 수 있었습니다.

리소스 정리

만든 Azure 리소스가 더 이상 필요하지 않은 경우 다음 Azure CLI 명령을 실행하여 리소스 그룹을 삭제합니다. 리소스 그룹을 삭제하면 리소스 그룹에 포함된 리소스도 삭제됩니다.

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

자세한 내용은 리소스 정리 참조하세요.