Bagikan melalui


Tutorial: Menyambungkan aplikasi ASP.NET Core ke integrasi penyimpanan .NET Aspire

Aplikasi cloud-native sering memerlukan solusi penyimpanan yang dapat diskalakan yang menyediakan kemampuan seperti penyimpanan blob, antrean, atau database NoSQL semi terstruktur. Integrasi .NET Aspire menyederhanakan koneksi ke berbagai layanan penyimpanan, seperti Azure Blob Storage. Dalam tutorial ini, Anda akan membuat aplikasi ASP.NET Core yang menggunakan integrasi .NET Aspire untuk terhubung ke Azure Blob Storage dan Azure Queue Storage untuk mengirimkan tiket dukungan. Aplikasi mengirimkan tiket ke antrean untuk diproses dan mengunggah lampiran ke penyimpanan. Anda akan mempelajari cara:

  • Membuat aplikasi .NET dasar yang disiapkan untuk menggunakan integrasi .NET Aspire
  • Menambahkan integrasi .NET.NET Aspire untuk menyambungkan ke beberapa layanan penyimpanan
  • Mengonfigurasi dan menggunakan fitur Komponen .NET.NET Aspire untuk mengirim dan menerima data

Prasyarat

Untuk bekerja dengan .NET.NET Aspire, Anda memerlukan hal berikut yang diinstal secara lokal:

Untuk informasi selengkapnya, lihat penyiapan dan alat .NET.NET Aspire, dan .NET.NET Aspire SDK.

Menjelajahi aplikasi sampel yang telah selesai

Versi lengkap aplikasi sampel dari tutorial ini tersedia di GitHub. Proyek ini juga disusun sebagai templat untuk Azure Developer CLI, yang berarti Anda dapat menggunakan perintah azd up untuk mengotomatiskan provisi sumber daya Azure jika Anda memiliki alat diinstal.

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

Menyiapkan sumber daya Azure Storage

Untuk artikel ini, Anda memerlukan akses kontributor data ke akun Azure Storage dengan kontainer blob dan antrean penyimpanan. Pastikan Anda memiliki sumber daya dan konfigurasi berikut yang tersedia:

Untuk artikel ini, Anda harus membuat kontainer blob dan sumber daya antrean penyimpanan di lingkungan pengembangan lokal Anda menggunakan emulator. Untuk melakukannya, gunakan Azurite. Azurite adalah server yang kompatibel dengan API Penyimpanan (emulator) gratis, sumber terbuka, lintas platform Azure storage yang berjalan dalam kontainer Docker.

Untuk menggunakan emulator, Anda perlu menginstal Azurite.

  1. Akun Penyimpanan Azure - Membuat akun penyimpanan.
  2. Kontainer Blob Storage bernama fileuploads - Membuat kontainer penyimpanan blob.
  3. Sebuah Antrian Penyimpanan bernama tiket - Membuat antrian penyimpanan.

Jalankan perintah berikut di Azure CLI atau CloudShell untuk menyiapkan sumber daya Azure Storage yang diperlukan:

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

Anda juga perlu menetapkan peran berikut kepada akun pengguna yang Anda gunakan untuk masuk ke Visual Studio:

Azure Developer CLI memungkinkan Anda menyediakan dan menyebarkan sumber daya Azure menggunakan sistem templat. Tutorial ini menyediakan templat lengkap yang menyediakan sumber daya yang diperlukan dan menyertakan kode aplikasi sampel yang telah selesai. Jalankan perintah berikut untuk menginisialisasi dan menjalankan templat:

  1. Jalankan azd auth login untuk masuk ke Azure:

    azd auth login
    
  2. Jalankan azd init untuk mengkloning dan menginisialisasi templat sampel:

    azd init --template dotnet-aspire-connect-storage
    
  3. Jalankan azd up untuk menyediakan sumber daya Azure:

    azd up
    
  4. Saat diminta, pilih langganan dan wilayah Azure untuk sumber daya yang disediakan. Templat menjalankan dan menyelesaikan tugas berikut untuk Anda:

    • Membuat Akun Penyimpanan Azure dengan layanan blob dan antrean diaktifkan
    • Membuat kontainer penyimpanan blob bernama fileUploads
    • Membuat antrian bernama tickets
    • Menetapkan peran berikut ke akun pengguna yang menjalankan templat.
      • Kontributor Data Blob Penyimpanan
      • Kontributor Data Antrian Penyimpanan

Setelah operasi berhasil diselesaikan, Anda memiliki dua opsi bergerak maju:

  • Opsi 1: Jalankan aplikasi sampel .NET di templat src direktori untuk bereksperimen dengan aplikasi yang telah selesai.
  • Opsi 2: Buat aplikasi sampel langkah demi langkah menggunakan bagian di depan dan sambungkan ke sumber daya Azure yang disediakan oleh azd.

Membuat solusi sampel

Buat proyek .NET Aspire menggunakan Visual Studio atau CLI .NET.

  1. Di bagian atas Visual Studio, navigasikan ke File >Proyek>Baru.
  2. Di jendela dialog, cari Aspire dan pilih .NET.NET Aspire Aplikasi Starter. Pilih Berikutnya.
  3. Pada layar Konfigurasikan proyek baru Anda:
    • Masukkan Nama Solusi dari AspireStorage dan pilih Berikutnya.
  4. Pada layar informasi tambahan:
    • Hapus centang dan gunakan Redis untuk cache (tidak diperlukan untuk tutorial ini).
    • Pilih Buat.

Visual Studio membuat solusi ASP.NET Core baru yang terstruktur untuk menggunakan .NET Aspire.

Solusinya terdiri dari proyek-proyek berikut:

  • AspireStorage.ApiService - Proyek API dengan konfigurasi layanan .NET.NET Aspire default.
  • AspireStorage.AppHost - Proyek orkestrator yang dirancang untuk menyambungkan dan mengonfigurasi berbagai proyek dan layanan aplikasi Anda. Orkestrator harus dijadikan sebagai proyek awal.
  • AspireStorage.ServiceDefaults - Pustaka kelas bersama untuk menyimpan kode yang dapat digunakan kembali di seluruh proyek dalam solusi Anda.
  • AspireStorage.Web - Proyek BlazorServer yang berfungsi sebagai antarmuka depan dari aplikasi Anda.

Menambahkan proyek Worker Service

Selanjutnya, tambahkan proyek Worker Service ke solusi untuk mengambil dan memproses pesan saat ditambahkan ke antrian penyimpanan Azure.

  1. Di penjelajah solusi, klik kanan pada tingkat atas node solusi AspireStorage dan pilih Tambahkan>Proyek baru.
  2. Cari dan pilih templat Worker Service dan pilih Berikutnya.
  3. Untuk nama proyek , masukkan AspireStorage.WorkerService dan pilih Berikutnya.
  4. Pada layar informasi tambahan:
    • Pastikan .NET 9.0 dipilih.
    • Pastikan daftar di .NET.NET Aspire orkestrasi dicentang dan pilih Buat.

Visual Studio menambahkan proyek ke solusi Anda dan memperbarui file Program.cs proyek AspireStorage.AppHost dengan baris kode baru:

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

Visual Studio telah menambahkan baris kode ini untuk mendaftarkan proyek baru Anda dengan objek IDistributedApplicationBuilder, yang memungkinkan fitur orkestrasi. Untuk informasi selengkapnya, lihat gambaran umum orkestrasi .NET.NET Aspire.

Struktur solusi yang telah selesai harus menyerupai berikut ini:

Cuplikan layar yang menunjukkan struktur solusi sampel penyimpanan .NET.NET Aspire.

Menambahkan integrasi .NET Aspire ke aplikasi Blazor

Tambahkan integrasi .NET AspireAzure Blob Storage dan paket integrasi Queue Storage .NET AspireAzure ke proyek Anda AspireStorage.Web.

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

Proyek AspireStorage.Web Anda sekarang telah disiapkan untuk siap menggunakan integrasi .NET.NET Aspire. Berikut adalah file AspireStorage.Web.csproj yang telah diperbarui:

<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.1.0" />
    <PackageReference Include="Aspire.Azure.Storage.Queues" Version="9.1.0" />
  </ItemGroup>

</Project>

Langkah selanjutnya adalah menambahkan integrasi ke aplikasi.

Di dalam file Program.cs dari proyek AspireStorage.Web, tambahkan panggilan ke metode ekstensi AddAzureBlobClient dan AddAzureQueueClient setelah pembuatan builder tetapi sebelum panggilan ke AddServiceDefaults. Untuk informasi selengkapnya, lihat default layanan .NET.NET Aspire. Berikan nama string koneksi Anda sebagai parameter.

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();

Dengan pernyataan using tambahan, metode ini menyelesaikan tugas-tugas berikut:

Ketika proyek AspireStorage.Web dimulai, proyek tersebut akan membuat kontainer di Azurite Blob Storage dan antrean di Azurite Queue Storage. Ini kondisional saat aplikasi berjalan di lingkungan pengembangan. Saat aplikasi berjalan di lingkungan produksi, kontainer dan antrean diasumsikan telah dibuat.

Menambahkan integrasi .NET Aspire ke Worker Service

Layanan pekerja menangani penarikan pesan dari antrean Azure Storage untuk diproses. Tambahkan paket integrasi integrasi Queue Storage ke aplikasi AspireStorage.WorkerService Anda:

dotnet add package Aspire.Azure.Storage.Queues

Dalam file Program.cs untuk proyek AspireStorage.WorkerService, tambahkan panggilan ke metode ekstensi AddAzureQueueClient setelah membuat builder tetapi sebelum memanggil AddServiceDefaults:

using AspireStorage.WorkerService;

var builder = Host.CreateApplicationBuilder(args);

builder.AddAzureQueueClient("QueueConnection");

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

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

Metode ini menangani tugas-tugas berikut:

  • Daftarkan QueueServiceClient di dalam kontainer DI untuk menghubungkan ke Azure Storage Queues.
  • Aktifkan pemeriksaan kesehatan, pengelogan, dan telemetri yang sesuai secara otomatis untuk layanan masing-masing.

Membuat formulir

Aplikasi ini memerlukan formulir agar pengguna dapat mengirimkan informasi tiket dukungan dan mengunggah lampiran. Aplikasi ini mengunggah file terlampir pada properti Document (IFormFile) ke Azure Blob Storage menggunakan BlobServiceClientyang disuntikkan . QueueServiceClient mengirim pesan yang terdiri dari Title dan Description ke Antrean Penyimpanan Azure.

Gunakan markup Razor berikut untuk membuat formulir dasar, menggantikan konten file Home.razor di direktori AspireStorage.Web/Components/Pages:

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

Untuk informasi selengkapnya tentang membuat formulir di Blazor, lihat gambaran umum formulir ASP.NET CoreBlazor.

Memperbarui AppHost

Proyek AspireStorage.AppHost adalah orkestrator untuk aplikasi Anda. Ini bertanggung jawab untuk menghubungkan dan mengonfigurasi berbagai proyek dan layanan aplikasi Anda. Orkestrator harus dijadikan sebagai proyek awal.

Untuk menambahkan dukungan Azure Storage hosting ke IDistributedApplicationBuilderAnda, instal paket 📦Aspire.Hosting.Azure.Storage NuGet.

dotnet add package Aspire.Hosting.Azure.Storage

Ganti konten file di proyek AspireStorage.AppHost dengan kode berikut:

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();

Kode sebelumnya menambahkan penyimpanan, blob, dan antrean Azure, dan saat dalam mode pengembangan, kode tersebut menggunakan emulator. Setiap proyek mendefinisikan referensi untuk sumber daya ini yang bergantung padanya.

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();

Kode sebelumnya menambahkan penyimpanan, blob, dan antrean Azure, dan menentukan referensi untuk sumber daya ini dalam setiap proyek yang bergantung padanya.

Memproses barang dalam antrean

Saat pesan baru ditempatkan pada antrean tickets, layanan pekerja harus mengambil, memproses, dan menghapus pesan tersebut. Perbarui kelas Worker.cs, ganti konten dengan kode berikut:

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

Sebelum layanan pekerja dapat memproses pesan, layanan tersebut harus dapat tersambung ke antrean penyimpanan Azure. Dengan Azurite, Anda perlu memastikan bahwa antrean pesan tersedia sebelum layanan pekerja mulai menjalankan pemrosesan antrean pesan.

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

Layanan pekerja memproses pesan dengan menghubungkan ke antrean penyimpanan Azure, dan mengambil pesan dari antrean tersebut.

Layanan pekerja memproses pesan dalam antrean dan menghapusnya saat telah diproses.

Mengonfigurasi string koneksi

Proyek AspireStorage dan AspireStorage.Worker harus dikonfigurasi untuk tersambung ke Akun Penyimpanan yang benar yang Anda buat sebelumnya. Anda dapat menentukan titik akhir untuk layanan blob dan antrean di akun penyimpanan menggunakan file appsettings.json di setiap proyek.

  1. Dalam proyek AspireStorage, tambahkan konfigurasi berikut ke file 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. Dalam proyek AspireStorage.Worker, tambahkan konfigurasi berikut ke file :

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

Menjalankan dan menguji aplikasi secara lokal

Aplikasi sampel sekarang siap untuk pengujian. Verifikasi bahwa data formulir yang dikirimkan dikirim ke Azure Blob Storage dan Azure Queue Storage dengan menyelesaikan langkah-langkah berikut:

  1. Tekan tombol jalankan di bagian atas Visual Studio untuk meluncurkan dasbor proyek .NET Aspire Anda di browser.

  2. Pada halaman sumber daya, di baris aspirestorage.web, klik tautan di kolom Titik Akhir untuk membuka UI aplikasi Anda.

    Cuplikan layar yang memperlihatkan halaman beranda aplikasi dukungan .NET.NET Aspire.

  3. Masukkan data sampel ke bidang formulir Title dan Description dan pilih file sederhana untuk diunggah.

  4. Pilih tombol Kirim, dan formulir mengirimkan tiket dukungan untuk diproses — dan menghapus formulir.

  5. Di tab browser terpisah, gunakan portal Azure untuk menavigasi ke browser Storage di Akun Penyimpanan Azure Anda.

  6. Pilih Kontainer lalu masuk ke kontainer Dokumen untuk melihat file yang diunggah.

  7. Anda dapat memverifikasi apakah pesan pada antrean sudah diproses dengan melihat log Project pada dasbor .NET.NET Aspire, dan memilih aspirestorage.workerservice dari menu dropdown.

    Cuplikan layar yang menampilkan output konsol aplikasi Pekerja.

Ringkasan

Contoh aplikasi yang Anda buat menunjukkan penyimpanan blob dari ASP.NET CoreBlazor Web App dan pemrosesan antrean dalam .NET Worker Service. Aplikasi Anda terhubung ke Azure Storage menggunakan integrasi .NET Aspire. Aplikasi mengirimkan tiket dukungan ke antrean untuk diproses dan mengunggah lampiran ke penyimpanan.

Karena Anda memilih untuk menggunakan Azurite, Anda tidak perlu membersihkan sumber daya ini ketika Anda selesai mengujinya, saat Anda membuatnya secara lokal dalam konteks emulator. Emulator memungkinkan Anda menguji aplikasi secara lokal tanpa dikenakan biaya apa pun, karena tidak ada sumber daya Azure yang disediakan atau dibuat.

Membersihkan sumber daya

Jalankan perintah CLI Azure berikut untuk menghapus grup sumber daya saat Anda tidak lagi memerlukan sumber daya Azure yang Anda buat. Menghapus grup sumber daya juga menghapus sumber daya yang terkandung di dalamnya.

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

Untuk informasi selengkapnya, lihat Membersihkan sumber daya di Azure.