Självstudie: Anslut en ASP.NET Core app till .NET Aspire lagringsintegrationer
Molnbaserade appar kräver ofta skalbara lagringslösningar som tillhandahåller funktioner som bloblagring, köer eller halvstrukturerade NoSQL-databaser. .NET Aspire integreringar förenklar anslutningar till olika lagringstjänster, till exempel Azure Blob Storage. I den här självstudien skapar du en ASP.NET Core-app som använder .NET Aspire-integreringar för att ansluta till Azure Blob Storage och Azure Queue Storage för att skicka supportärenden. Appen skickar biljetterna till en kö för bearbetning och laddar upp en bifogad fil till lagringen. Du får lära dig att:
- Skapa en grundläggande .NET app som är konfigurerad för att använda .NET Aspire integreringar
- Lägga till .NET.NET Aspire integreringar för att ansluta till flera lagringstjänster
- Konfigurera och använda .NET.NET Aspire komponentfunktioner för att skicka och ta emot data
Förutsättningar
Om du vill arbeta med .NET.NET Aspirebehöver du följande installerat lokalt:
- .NET 8,0 eller .NET 9,0
- En OCI-kompatibel containerkörningsmiljö, till exempel:
- Docker Desktop eller Podman. Mer information finns i Container Runtime.
- En IDE (Integrated Developer Environment) eller kodredigerare, till exempel:
- Visual Studio 2022 version 17.9 eller senare (valfritt)
-
Visual Studio Code (valfritt)
- C# Dev Kit: Tillägg (valfritt)
- JetBrains Rider med .NET.NET Aspire plugin, (valfritt)
Mer information finns i .NET.NET Aspire installation och verktygoch .NET.NET Aspire SDK.
Utforska den färdiga exempelappen
En färdig version av exempelapplikationen från den här handledningen finns på GitHub. Projektet är också strukturerat som en mall för Azure Developer CLI, vilket innebär att du kan använda kommandot azd up
för att automatisera Azure resursetablering om du har verktyget installerat.
git clone https://github.com/Azure-Samples/dotnet-aspire-connect-storage.git
Konfigurera Azure Storage-resurser
I den här artikeln behöver du datadeltagares åtkomst till ett Azure Storage-konto med en blobcontainer och en lagringskö. Se till att du har följande resurser och konfigurationer tillgängliga:
I den här artikeln måste du skapa en blobcontainer och lagringsköresurs i din lokala utvecklingsmiljö med hjälp av en emulator. Om du vill göra det använder du Azurite. Azurite är en kostnadsfri, plattformsoberoende Azure Storage API-kompatibel server (emulator) som körs i en Docker container.
Om du vill använda emulatorn måste du installera Azurite.
- Ett Azure Storage-konto – Skapa ett lagringskonto.
- En bloblagringscontainer med namnet - Skapa en bloblagringscontainer.
- En lagringskö med namnet biljetter - Skapa en lagringskö.
Kör följande kommandon i Azure CLI eller CloudShell för att konfigurera nödvändiga Azure Storage-resurser:
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
Du måste också tilldela följande roller till det användarkonto som du är inloggad på Visual Studio med:
- Storage Blob Data-Bidragsgivare – Tilldela en Azure RBAC-roll
- Lagringsködatadeltagare – Tilldela en Azure RBAC-roll
Med Azure Developer CLI kan du etablera och distribuera Azure resurser med hjälp av ett mallsystem. Den här handledningen innehåller en fullständig mall som tillhandahåller de nödvändiga Azure resurserna och inkluderar det färdiga exemplet på programkod. Kör följande kommandon för att initiera och köra mallen:
Kör
azd auth login
för att logga in på Azure:azd auth login
Kör
azd init
för att klona och initiera exempelmallen:azd init --template dotnet-aspire-connect-storage
Kör
azd up
för att tilldela Azure resurser.azd up
När du uppmanas till det väljer du prenumerationen och Azure region för de etablerade resurserna. Mallen kör och slutför följande uppgifter åt dig:
- Skapar ett Azure lagringskonto med blob- och kötjänster aktiverade
- Skapar en bloblagringscontainer med namnet
fileUploads
- Skapar en kö med namnet
tickets
- Tilldelar följande roller till användarkontot som körde mallen.
- Storage Blob Data-deltagare
- Lagringsködatadeltagare
När åtgärden har slutförts har du två alternativ framöver:
- Alternativ 1: Kör .NET exempelappen i mallen
src
katalog för att experimentera med den slutförda appen. - Alternativ 2: Skapa exempelappen steg för steg med hjälp av avsnitten framåt och anslut den till de Azure resurser som har etablerats av
azd
.
Skapa exempellösningen
Skapa ett .NET Aspire projekt med antingen Visual Studio eller .NET CLI.
- Överst i Visual Studionavigerar du till File>New>Project.
- I dialogrutan söker du efter Aspire och väljer .NET.NET Aspire Starter Application. Välj Nästa.
- På skärmen Konfigurera ditt nya projekt:
- Ange ett lösningsnamn för AspireStorage och välj Nästa.
- På skärmen Ytterligare information:
- Avmarkera Använd Redis för cachelagring av (krävs inte för den här självstudien).
- Välj Skapa.
Visual Studio skapar en ny ASP.NET Core lösning som är strukturerad för att använda .NET Aspire.
Lösningen består av följande projekt:
- AspireStorage.ApiService – ett API-projekt med standardkonfigurationer för .NET.NET Aspire-tjänsten.
- AspireStorage.AppHost – ett orkestreringsprojekt som är utformat för att ansluta och konfigurera de olika projekten och tjänsterna i din app. Orkestratorn ska ställas in som startprojekt.
- AspireStorage.ServiceDefaults – ett bibliotek för delad klass som innehåller kod som kan återanvändas i projekten i din lösning.
- AspireStorage.Web – ett BlazorServer projekt som fungerar som klientdelen av din app.
Lägg till projektet Worker Service
Lägg sedan till ett Worker Service projekt i lösningen för att hämta och bearbeta meddelanden när de läggs till i Azure Storage-kön.
- Högerklicka på den översta nivån AspireStorage lösningsnod i Solution Explorer och välj Lägg till>Nytt projekt.
- Sök efter och välj mallen Worker Service och välj Nästa.
- För namnet Projectanger du AspireStorage.WorkerService och väljer Nästa.
- På skärmen Ytterligare information:
- Kontrollera att .NET 9.0 är markerat.
- Kontrollera att Registrera i .NET.NET Aspire orkestrering är markerad och välj Skapa.
Visual Studio lägger till projektet i din lösning och uppdaterar Program.cs-filen i projektet AspireStorage.AppHost med en ny kodrad:
builder.AddProject<Projects.AspireStorage_WorkerService>(
"aspirestorage-workerservice");
Visual Studio verktyg har lagt till den här kodraden för att registrera ditt nya projekt med IDistributedApplicationBuilder-objektet, vilket möjliggör orkestreringsfunktioner. Se .NET.NET Aspire översikt över orkestreringför mer information.
Den färdiga lösningsstrukturen bör likna följande:
Lägg till .NET Aspire-integreringar i Blazor-appen
Lägg till integreringspaketen .NET AspireAzure Blob Storage integration och .NET AspireAzure Queue Storage i projektet AspireStorage.Web:
dotnet add package Aspire.Azure.Storage.Blobs
dotnet add package Aspire.Azure.Storage.Queues
Ditt AspireStorage.Web-projekt har nu konfigurerats för att använda .NET.NET Aspire integreringar. Här är den uppdaterade filen 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>
Nästa steg är att lägga till integreringarna i appen.
I Program.cs-filen i projektet AspireStorage.Web lägger du till anrop till AddAzureBlobClient- och AddAzureQueueClient-tilläggsmetoderna när builder
har skapats men innan anropet till AddServiceDefaults
. Mer information finns i standardvärden för tjänsten .NET.NET Aspire. Ange namnet på anslutningssträngen som en 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();
Med de ytterligare using
-instruktionerna utför dessa metoder följande uppgifter:
- Registrera en Azure.Storage.Blobs.BlobServiceClient och en Azure.Storage.Queues.QueueServiceClient med DI-containern för anslutning till Azure Storage.
- Aktivera automatiskt motsvarande hälsokontroller, loggning och telemetri för respektive tjänster.
När projektet AspireStorage.Web startar skapas en fileuploads
container i Azurite Blob Storage och en tickets
kö i Azurite Queue Storage. Detta är villkorsstyrd när appen körs i en utvecklingsmiljö. När appen körs i en produktionsmiljö antas containern och kön redan ha skapats.
Lägg till .NET Aspire-integreringen i Worker Service
Arbetstjänsten hanterar att ta bort meddelanden från Azure Storage-kön för bearbetning. Lägg till Queue Storage-integrationspaketet .NET AspireAzure till din AspireStorage.WorkerService-app:
dotnet add package Aspire.Azure.Storage.Queues
I Program.cs-filen i projektet AspireStorage.WorkerService lägger du till ett anrop till AddAzureQueueClient-tilläggsmetoden när builder
har skapats men innan anropet till AddServiceDefaults
:
using AspireStorage.WorkerService;
var builder = Host.CreateApplicationBuilder(args);
builder.AddAzureQueueClient("QueueConnection");
builder.AddServiceDefaults();
builder.Services.AddHostedService<WorkerService>();
var host = builder.Build();
host.Run();
Den här metoden hanterar följande uppgifter:
- Registrera en QueueServiceClient med DI-containern för att koppla till Azure Storage Queues.
- Aktivera automatiskt motsvarande hälsokontroller, loggning och telemetri för respektive tjänster.
Skapa formuläret
Appen kräver ett formulär för att användaren ska kunna skicka supportärendeinformation och ladda upp en bifogad fil. Appen laddar upp den bifogade filen på egenskapen Document
(IFormFile) till Azure Blob Storage med hjälp av den injicerade BlobServiceClient.
QueueServiceClient skickar ett meddelande som består av Title
och Description
till Azure Storage Queue.
Använd följande Razor-kod för att skapa ett grundläggande formulär som ersätter innehållet i Home.razor--filen i katalogen 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!;
}
}
Mer information om hur du skapar formulär i Blazorfinns i ASP.NET CoreBlazor formuläröversikt.
Uppdatera AppHost
Projektet AspireStorage.AppHost är orchestrator för din app. Den ansvarar för att ansluta och konfigurera de olika projekten och tjänsterna i din app. Orkestratorn ska ställas in som startprojekt.
För att lägga till värdstöd för Azure Storage till din IDistributedApplicationBuilder, installerar du 📦Aspire.Hosting.Azure.Storage NuGet-paket.
dotnet add package Aspire.Hosting.Azure.Storage
Ersätt innehållet i filen Program.cs i projektet AspireStorage.AppHost med följande kod:
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();
Föregående kod lägger till Azure lagring, blobbar och köer, och när den är i utvecklingsläge använder den emulatorn. Varje projekt definierar referenser för de resurser som de är beroende av.
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();
Föregående kod lägger till Azure lagring, blobbar och köer och definierar referenser för dessa resurser i varje projekt som är beroende av dem.
Bearbeta objekten i kön
När ett nytt meddelande placeras i kön tickets
ska arbetstjänsten hämta, bearbeta och ta bort meddelandet. Uppdatera klassen Worker.cs och ersätt innehållet med följande kod:
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);
}
}
}
Innan arbetstjänsten kan bearbeta meddelanden måste den kunna ansluta till Azure Storage-kön. Med Azurite måste du se till att kön är tillgänglig innan arbetartjänsten börjar bearbeta meddelandekön.
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);
}
}
}
Arbetstjänsten bearbetar meddelanden genom att ansluta till Azure Storage-kön och ta bort meddelanden från kön.
Arbetstjänsten bearbetar meddelanden i kön och tar bort dem efter att de har bearbetats.
Konfigurera anslutningssträngarna
AspireStorage- och AspireStorage.Worker- projekt måste konfigureras för att ansluta till rätt Azure lagringskonto som du skapade tidigare. Du kan ange slutpunkterna för blob- och kötjänsterna i lagringskontot med hjälp av filen appsettings.json i varje projekt.
I projektet AspireStorage lägger du till följande konfiguration i
appsettings.Development.json
-filen:"ConnectionStrings": { "BlobConnection": "https://<your-storage-account-name>.blob.core.windows.net/", "QueueConnection": "https://<your-storage-account-name>.queue.core.windows.net/" }
I projektet AspireStorage.Worker lägger du till följande konfiguration i filen
appsettings.Development.json
:"ConnectionStrings": { "QueueConnection": "https://<your-storage-account-name>.queue.core.windows.net/" }
Köra och testa appen lokalt
Exempelappen är nu redo för testning. Kontrollera att de inskickade formulärdata skickas till Azure Blob Storage och Azure Queue Storage genom att utföra följande steg:
Tryck på körningsknappen överst i Visual Studio för att starta din .NET Aspire projektinstrumentpanel i webbläsaren.
På resurssidan i raden aspirestorage.web klickar du på länken i kolumnen Slutpunkter för att öppna appens användargränssnitt.
Ange exempeldata i formulärfälten
Title
ochDescription
och välj en enkel fil att ladda upp.Välj knappen Skicka och formuläret skickar supportbegäran för bearbetning – och rensar formuläret.
På en separat webbläsarflik använder du Azure-portalen för att navigera till webbläsaren Storage i ditt Azure Storage-konto.
Välj Containers och navigera sedan till containern Documents för att se den uppladdade filen.
Du kan verifiera att meddelandet i kön har bearbetats genom att titta på Project-loggarna på instrumentpanelen .NET.NET Aspireoch välja aspirestorage.workerservice i listrutan.
Sammanfattning
Exempelappen som du har skapat visar varaktiga blobbar i en ASP.NET CoreBlazor webbapp och bearbetningsköer i en .NET Worker Service. Appen ansluter till Azure Storage med hjälp av .NET Aspire integreringar. Appen skickar supportärendena till en kö för bearbetning och laddar upp en bifogad fil till lagringen.
Eftersom du väljer att använda Azurite behöver du inte rensa resurserna när du är klar med att testa dem, eftersom du skapade dem lokalt i kontexten för en emulator. Med emulatorn kunde du testa appen lokalt utan att medföra några kostnader, eftersom inga Azure resurser etablerades eller skapades.
Rensa resurser
Kör följande Azure CLI-kommando för att ta bort resursgruppen när du inte längre behöver de Azure resurser som du skapade. Om du tar bort resursgruppen tas även de resurser som ingår i den bort.
az group delete --name <your-resource-group-name>
Mer information finns i Rensa resurser i Azure.
.NET Aspire