Delen via


integratie van .NET AspireAzure Blob Storage

omvat:hostingintegratie en Client integratie

Azure Blob Storage is een service voor het opslaan van grote hoeveelheden ongestructureerde gegevens. Met de .NET AspireAzure Blob Storage-integratie kunt u verbinding maken met bestaande Azure Blob Storage exemplaren of nieuwe exemplaren maken vanuit .NET toepassingen.

Hostingintegratie

De .NET.NET AspireAzure Storage hosting integratiemodellen representeren de verschillende opslagbronnen als de volgende typen:

Als u toegang wilt krijgen tot deze typen en API's voor de expressie ervan, voegt u het 📦AspireHostingAzureOpslag NuGet-pakket toe in het app-hostproject .

dotnet add package Aspire.Hosting.Azure.Storage

Zie dotnet pakket toevoegen of Pakketafhankelijkheden beheren in .NET toepassingenvoor meer informatie.

Azure Storage-resource toevoegen

Roep in uw app-hostproject AddAzureStorage aan om een Storage-bronbouwer voor Azure toe te voegen en te retourneren.

var builder = DistributedApplication.CreateBuilder(args);

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

// An Azure Storage resource is required to add any of the following:
//
// - Azure Blob storage resource.
// - Azure Queue storage resource.
// - Azure Table storage resource.

// After adding all resources, run the app...

Wanneer u een AzureStorageResource toevoegt aan de app-host, worden er andere nuttige API's weergegeven om Azure Blob-, Queue- en Table Storage-resources toe te voegen. Met andere woorden, u moet een AzureStorageResource toevoegen voordat u een van de andere opslagbronnen toevoegt.

Belangrijk

Wanneer u AddAzureStorageaanroept, wordt impliciet AddAzureProvisioningaangeroepen. Hiermee wordt ondersteuning toegevoegd voor het dynamisch genereren van Azure resources tijdens het opstarten van de app. De app moet het juiste abonnement en de juiste locatie configureren. Zie Lokale inrichting: Configuratievoor meer informatie.

Gegenereerde Bicep-voorziening

Als u nieuw bent met Bicep, is het een domeinspecifieke taal voor het definiëren van Azure bronnen. Met .NET.NET Aspirehoeft u bicep niet handmatig te schrijven, in plaats daarvan genereren de inrichtings-API's Bicep voor u. Wanneer u uw app publiceert, wordt de aangemaakte Bicep weergegeven naast het manifestbestand. Wanneer u een Azure Storage-resource toevoegt, wordt de volgende Bicep gegenereerd:


wisselknop Azure Storage Bicep.

@description('The location for the resource(s) to be deployed.')
param location string = resourceGroup().location

param principalId string

param principalType string

resource storage 'Microsoft.Storage/storageAccounts@2024-01-01' = {
  name: take('storage${uniqueString(resourceGroup().id)}', 24)
  kind: 'StorageV2'
  location: location
  sku: {
    name: 'Standard_GRS'
  }
  properties: {
    accessTier: 'Hot'
    allowSharedKeyAccess: false
    minimumTlsVersion: 'TLS1_2'
    networkAcls: {
      defaultAction: 'Allow'
    }
  }
  tags: {
    'aspire-resource-name': 'storage'
  }
}

resource blobs 'Microsoft.Storage/storageAccounts/blobServices@2024-01-01' = {
  name: 'default'
  parent: storage
}

resource storage_StorageBlobDataContributor 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(storage.id, principalId, subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ba92f5b4-2d11-453d-a403-e96b0029c9fe'))
  properties: {
    principalId: principalId
    roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ba92f5b4-2d11-453d-a403-e96b0029c9fe')
    principalType: principalType
  }
  scope: storage
}

resource storage_StorageTableDataContributor 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(storage.id, principalId, subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '0a9a7e1f-b9d0-4cc4-a60d-0319b160aaa3'))
  properties: {
    principalId: principalId
    roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '0a9a7e1f-b9d0-4cc4-a60d-0319b160aaa3')
    principalType: principalType
  }
  scope: storage
}

resource storage_StorageQueueDataContributor 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(storage.id, principalId, subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '974c5e8b-45b9-4653-ba55-5f855dd0fb88'))
  properties: {
    principalId: principalId
    roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '974c5e8b-45b9-4653-ba55-5f855dd0fb88')
    principalType: principalType
  }
  scope: storage
}

output blobEndpoint string = storage.properties.primaryEndpoints.blob

output queueEndpoint string = storage.properties.primaryEndpoints.queue

output tableEndpoint string = storage.properties.primaryEndpoints.table

De voorgaande Bicep is een module die een Azure Storage-account in richt met de volgende standaardwaarden:

  • kind: het type opslagaccount. De standaardwaarde is StorageV2.
  • sku: de SKU van het opslagaccount. De standaardwaarde is Standard_GRS.
  • properties: de eigenschappen van het opslagaccount:
    • accessTier: de toegangslaag van het opslagaccount. De standaardwaarde is Hot.
    • allowSharedKeyAccess: een Booleaanse waarde die aangeeft of het opslagaccount toestaat dat aanvragen worden geautoriseerd met de toegangssleutel voor het account. De standaardwaarde is false.
    • minimumTlsVersion: de minimaal ondersteunde TLS-versie voor het opslagaccount. De standaardwaarde is TLS1_2.
    • networkAcls: de netwerk-ACL's voor het opslagaccount. De standaardwaarde is { defaultAction: 'Allow' }.

Naast het inrichten van het opslagaccount wordt er ook een blobcontainer voorzien.

De volgende roltoewijzingen worden toegevoegd aan het opslagaccount om uw toepassing toegang te verlenen. Zie de ingebouwde ingebouwde rollen voor Azure op rollen gebaseerd toegangsbeheer (Azure RBAC) voor meer informatie:

Rol/id Beschrijving
Inzender voor opslagblobgegevens
ba92f5b4-2d11-453d-a403-e96b0029c9fe
Lees-, schrijf- en verwijder Azure Storage-containers en -blobs.
Inzender voor opslagtabelgegevens
0a9a7e1f-b9d0-4cc4-a60d-0319b160aaa3
Lees-, schrijf- en verwijder Azure Storage-tabellen en -entiteiten.
Inzender voor opslagwachtrijgegevens
974c5e8b-45b9-4653-ba55-5f855dd0fb88
Lees-, schrijf- en verwijder Azure Storage-wachtrijen en wachtrijberichten.

De gegenereerde Bicep is een uitgangspunt en kan worden aangepast aan uw specifieke vereisten.

Voorzieningsinfrastructuur aanpassen

Alle .NET AspireAzure resources zijn subklassen van het AzureProvisioningResource type. Met dit type kunt u de gegenereerde Bicep aanpassen door een fluent-API te bieden om de Azure-resources te configureren, met behulp van de API ConfigureInfrastructure<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure>). U kunt bijvoorbeeld de kind, sku, propertiesen meer configureren. In het volgende voorbeeld ziet u hoe u de Azure Storage-resource aanpast:

builder.AddAzureStorage("storage")
    .ConfigureInfrastructure(infra =>
    {
        var storageAccount = infra.GetProvisionableResources()
                                  .OfType<StorageAccount>()
                                  .Single();

        storageAccount.AccessTier = StorageAccountAccessTier.Cool;
        storageAccount.Sku = new StorageSku { Name = StorageSkuName.PremiumZrs };
        storageAccount.Tags.Add("ExampleKey", "Example value");
    });

De voorgaande code:

Er zijn nog veel meer configuratieopties beschikbaar om de Azure Storage-resource aan te passen. Zie Azure.Provisioning.Storagevoor meer informatie.

Verbinding maken met een bestaand Azure Storage-account

Mogelijk hebt u een bestaand Azure Storage-account waarmee u verbinding wilt maken. In plaats van een nieuwe Azure Storage-resource weer te geven, kunt u een verbindingsreeks toevoegen aan de app-host. Als u een verbinding wilt toevoegen aan een bestaand Azure Storage-account, roept u de methode AddConnectionString aan:

var builder = DistributedApplication.CreateBuilder(args);

var blobs = builder.AddConnectionString("blobs");

builder.AddProject<Projects.WebApplication>("web")
       .WithReference(blobs);

// After adding all resources, run the app...

Notitie

Verbindingsreeksen worden gebruikt om een breed scala aan verbindingsgegevens weer te geven, waaronder databaseverbindingen, berichtbrokers, eindpunt-URI's en andere services. In .NET.NET Aspire nomenclatuur wordt de term "verbindingsreeks" gebruikt om alle soorten verbindingsgegevens weer te geven.

De verbindingsreeks is geconfigureerd in de configuratie van de app-host, meestal onder gebruikersgeheimen, onder de sectie ConnectionStrings. De app-host injecteert deze verbindingsreeks als een omgevingsvariabele in alle afhankelijke resources, bijvoorbeeld:

{
    "ConnectionStrings": {
        "blobs": "https://{account_name}.blob.core.windows.net/"
    }
}

De afhankelijke resource heeft toegang tot de geïnjecteerde verbindingsreeks door de methode GetConnectionString aan te roepen en de verbindingsnaam door te geven als de parameter, in dit geval "blobs". De GetConnectionString-API is een afkorting voor IConfiguration.GetSection("ConnectionStrings")[name].

Resource voor Azure Storage-emulator toevoegen

Als u een Azure Storage-emulatorresource wilt toevoegen, koppelt u een aanroep op een IResourceBuilder<AzureStorageResource> aan de RunAsEmulator-API:

var builder = DistributedApplication.CreateBuilder(args);

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

// After adding all resources, run the app...

Wanneer u RunAsEmulatoraanroept, worden uw opslagbronnen geconfigureerd voor lokaal uitvoeren met behulp van een emulator. De emulator in dit geval is Azurite. De opensource-emulator Van Azurite biedt een gratis lokale omgeving voor het testen van uw Azure Blob-, Queue Storage- en Table Storage-apps en het is een perfecte aanvulling op de .NET AspireAzure hostingintegratie. Azurite is niet geïnstalleerd, maar is toegankelijk voor .NET.NET Aspire als container. Wanneer u een container toevoegt aan de app-host, zoals wordt weergegeven in het vorige voorbeeld met de mcr.microsoft.com/azure-storage/azurite image, wordt de container gemaakt en gestart wanneer de app-host wordt gestart. Zie levenscyclus van containerresourcesvoor meer informatie.

Azurite-container configureren

Er zijn verschillende configuraties beschikbaar voor containerresources. U kunt bijvoorbeeld de poorten van de container, omgevingsvariabelen, de levensduuren meer configureren.

Azurite-containerpoorten configureren

Standaard stelt de Azurite-container, wanneer geconfigureerd door .NET.NET Aspire, de volgende eindpunten bloot:

Eindpunt Containerpoort Hostpoort
blob 10.000 dynamisch
queue 10001 dynamisch
table 10002 dynamisch

De poort waarop ze luisteren, is standaard dynamisch. Wanneer de container wordt gestart, worden de poorten toegewezen aan een willekeurige poort op de hostcomputer. Als u de eindpuntpoorten wilt configureren, koppelt u aanroepen van de containerresourcebouwer die wordt geleverd door de RunAsEmulator methode, zoals wordt weergegeven in het volgende voorbeeld:

var builder = DistributedApplication.CreateBuilder(args);

var storage = builder.AddAzureStorage("storage").RunAsEmulator(
                     azurite =>
                     {
                         azurite.WithBlobPort("blob", 27000)
                                .WithQueuePort("queue", 27001)
                                .WithTablePort("table", 27002);
                     });

// After adding all resources, run the app...

De voorgaande code configureert de bestaande blob, queueen table eindpunten van de Azurite-container om respectievelijk te luisteren op poorten 27000, 27001en 27002. De poorten van de Azurite-container worden toegewezen aan de hostpoorten, zoals wordt weergegeven in de volgende tabel:

Eindpuntnaam Poorttoewijzing (container:host)
blob 10000:27000
queue 10001:27001
table 10002:27002
Azurite-container configureren met een permanente levensduur

Als u de Azurite-container met een permanente levensduur wilt configureren, roept u de methode WithLifetime op de Resource van de Azurite-container aan en geeft u ContainerLifetime.Persistentdoor:

var builder = DistributedApplication.CreateBuilder(args);

var storage = builder.AddAzureStorage("storage").RunAsEmulator(
                     azurite =>
                     {
                         azurite.WithLifetime(ContainerLifetime.Persistent);
                     });

// After adding all resources, run the app...

Zie Levensduur van containerresourcesvoor meer informatie.

Azurite-container configureren met gegevensvolume

Als u een gegevensvolume wilt toevoegen aan de resource van de Azure Storage-emulator, roept u de WithDataVolume methode aan op de resource van de Azure Storage-emulator:

var builder = DistributedApplication.CreateBuilder(args);

var storage = builder.AddAzureStorage("storage").RunAsEmulator(
                     azurite =>
                     {
                         azurite.WithDataVolume();
                     });

// After adding all resources, run the app...

Het gegevensvolume wordt gebruikt om de Azurite-gegevens buiten de levenscyclus van de container te behouden. Het gegevensvolume wordt gekoppeld aan het /data pad in de Azure-container en wanneer er geen name parameter wordt opgegeven, wordt de naam opgemaakt als .azurite/{resource name}. Voor meer informatie over gegevensvolumes en details over waarom ze de voorkeur hebben boven bind mounts, zie Docker docs: Volumes.

Azure-container configureren met een data-bindmount

Als u een koppeling voor gegevensbinding wilt toevoegen aan de resource van de Azure Storage-emulator, roept u de WithDataBindMount methode aan:

var builder = DistributedApplication.CreateBuilder(args);

var storage = builder.AddAzureStorage("storage").RunAsEmulator(
                     azurite =>
                     {
                         azurite.WithDataBindMount("../Azurite/Data");
                     });

// After adding all resources, run the app...

Belangrijk

Gegevens koppelen beperkte functionaliteit hebben in vergelijking met volumes, die betere prestaties, draagbaarheid en beveiliging bieden, waardoor ze geschikter zijn voor productieomgevingen. Bind mounts bieden echter directe toegang tot bestanden en de mogelijkheid om ze te wijzigen op het hostsysteem, ideaal voor ontwikkeling en testen waarbij realtime wijzigingen nodig zijn.

Gegevenskoppelingen zijn afhankelijk van het bestandssysteem van de hostcomputer om de Azurite-gegevens bij herstarten van de container te behouden. De gegevenskoppelingspunt wordt gekoppeld aan het ../Azurite/Data-pad op de hostcomputer, ten opzichte van de app-hostdirectory (IDistributedApplicationBuilder.AppHostDirectory) in de Azurite-container. Zie Docker docs: Bindingskoppelingenvoor meer informatie over koppelingskoppelingen voor gegevens.

Verbinding maken met opslagbronnen

Wanneer de .NET.NET Aspire app-host wordt uitgevoerd, kunnen de opslagbronnen worden geopend door externe hulpprogramma's, zoals de Azure Storage Explorer-. Als uw opslagresource lokaal wordt uitgevoerd met behulp van Azurite, wordt deze automatisch opgehaald door de Azure Storage Explorer.

Notitie

De Azure Storage Explorer detecteert Opslagbronnen van Azurite, ervan uitgaande dat de standaardpoorten worden gebruikt. Als u de Azurite-container geconfigureerd voor het gebruik van verschillende poorten, moet u de Azure Storage Explorer configureren om verbinding te maken met de juiste poorten.

Voer de volgende stappen uit om vanuit Azure Storage Explorer verbinding te maken met de opslagresource:

  1. Voer de .NET.NET Aspire-app-host uit.

  2. Open de Azure Storage Explorer (opslagverkenner).

  3. Bekijk het deelvenster Explorer.

  4. Selecteer de koppeling Vernieuw alles om de lijst met opslagaccounts te vernieuwen.

  5. Vouw het knooppunt Emulator & Gekoppeld uit.

  6. Vouw het knooppunt Opslagaccounts uit.

  7. U zou een opslagaccount met de naam van uw resource als voorvoegsel moeten zien.

    Azure Storage Explorer: Opslagresource van Azurite gedetecteerd.

U kunt het opslagaccount en de inhoud ervan verkennen met behulp van de Azure Storage Explorer. Zie Azurevoor meer informatie over het gebruik van de Storage Explorer.

Azure Blob Storage-resource toevoegen

Registreer in uw app-hostproject de Azure Blob Storage-integratie door een aanroep te koppelen aan AddBlobs op het IResourceBuilder<IAzureStorageResource> exemplaar dat door AddAzureStoragewordt geretourneerd. In het volgende voorbeeld ziet u hoe u een Azure Blob Storage resource met de naam storage en een blobcontainer met de naam blobstoevoegt:

var builder = DistributedApplication.CreateBuilder(args);

var blobs = builder.AddAzureStorage("storage")
                   .RunAsEmulator();
                   .AddBlobs("blobs");

builder.AddProject<Projects.ExampleProject>()
       .WithReference(blobs)
       .WaitFor(blobs);

// After adding all resources, run the app...

De voorgaande code:

  • Hiermee wordt een Azure Storage-resource met de naam storagetoegevoegd.
  • Koppelt een aanroep aan RunAsEmulator om de opslagresource te configureren die lokaal moet worden uitgevoerd met behulp van een emulator. De emulator in dit geval is Azurite.
  • Hiermee voegt u een blobcontainer met de naam blobs toe aan de opslagresource.
  • Voegt de blobs resource toe aan de ExampleProject en wacht tot deze gereed is voordat het project wordt gestart.

Gezondheidscontroles voor hostingintegratie

De integratie van Azure Storage-hosting voegt automatisch een statuscontrole toe voor de opslagresource. Het wordt alleen toegevoegd wanneer het als een emulator wordt uitgevoerd en controleert of de Azurite-container actief is en of er verbinding mee gemaakt kan worden. De hostingintegratie is afhankelijk van de 📦 AspNetCore.HealthChecks.Azure. Storage.Blobs NuGet-pakket.

integratie van Client

Installeer de .NET AspireAzure Blob Storageom aan de slag te gaan met de client📦Aspire-integratie.Azure. Storage.Blobs NuGet-pakket in het client-verbruikende project, dat wil gezegd het project voor de toepassing die gebruikmaakt van de Azure Blob Storageclient. De Azure Blob Storageclient-integratie registreert een BlobServiceClient exemplaar dat u kunt gebruiken om met Azure Blob Storagete communiceren.

dotnet add package Aspire.Azure.Storage.Blobs

Azure Blob Storage client toevoegen

Roep in het Program.cs-bestand van uw clientverbruikende project de AddAzureBlobClient-extensiemethode aan op elke IHostApplicationBuilder om een BlobServiceClient te registreren voor gebruik via de container voor afhankelijkheidsinjectie. De methode gebruikt een verbindingsnaamparameter.

builder.AddAzureBlobClient("blobs");

Vervolgens kunt u het BlobServiceClient exemplaar ophalen met behulp van afhankelijkheidsinjectie. Om bijvoorbeeld de client uit een service op te halen:

public class ExampleService(BlobServiceClient client)
{
    // Use client...
}

Configuratie

De .NET AspireAzure Blob Storage-integratie biedt meerdere opties voor het configureren van de BlobServiceClient op basis van de vereisten en conventies van uw project.

Een verbindingsreeks gebruiken

Wanneer u een verbindingsreeks uit de sectie ConnectionStrings configuratie gebruikt, kunt u de naam van de verbindingsreeks opgeven bij het aanroepen van AddAzureBlobClient:

builder.AddAzureBlobClient("blobs");

Vervolgens wordt de verbindingsreeks opgehaald uit de ConnectionStrings configuratiesectie en worden twee verbindingsindelingen ondersteund:

Service URI

De aanbevolen methode is om een ServiceUrite gebruiken, die werkt met de eigenschap AzureStorageBlobsSettings.Credential om een verbinding tot stand te brengen. Als er geen referentie is geconfigureerd, wordt de Azure.Identity.DefaultAzureCredential gebruikt.

{
  "ConnectionStrings": {
    "blobs": "https://{account_name}.blob.core.windows.net/"
  }
}
Verbindingsreeks

U kunt ook een Azure Storage-verbindingsreeks gebruiken.

{
  "ConnectionStrings": {
    "blobs": "AccountName=myaccount;AccountKey=myaccountkey"
  }
}

Zie Azure Storage-verbindingsreeksen configurerenvoor meer informatie.

Configuratieproviders gebruiken

De .NET AspireAzure Blob Storage-integratie ondersteunt Microsoft.Extensions.Configuration. Hiermee worden de AzureStorageBlobsSettings en BlobClientOptions vanuit de configuratie geladen met behulp van de Aspire:Azure:Storage:Blobs-key. Het volgende codefragment is een voorbeeld van een appsettings.json-bestand waarmee een aantal van de opties wordt geconfigureerd:

{
  "Aspire": {
    "Azure": {
      "Storage": {
        "Blobs": {
          "DisableHealthChecks": true,
          "DisableTracing": false,
          "ClientOptions": {
            "Diagnostics": {
              "ApplicationId": "myapp"
            }
          }
        }
      }
    }
  }
}

Zie voor het volledige Azure Blob Storageclient integratie JSON schema Aspire.AzureStorage.Blobs/ConfigurationSchema.json.

Gebruik inline delegates

U kunt de Action<AzureStorageBlobsSettings> configureSettings delegate ook doorgeven om enkele of alle opties inline in te stellen, bijvoorbeeld om controles voor gezondheid te configureren.

builder.AddAzureBlobClient(
    "blobs",
    settings => settings.DisableHealthChecks = true);

U kunt de BlobClientOptions ook instellen met behulp van de Action<IAzureClientBuilder<BlobServiceClient, BlobClientOptions>> configureClientBuilder gedelegeerde, de tweede parameter van de methode AddAzureBlobClient. Als u bijvoorbeeld het eerste deel van de headers van de gebruikersagent wilt instellen voor alle aanvragen gedaan door deze client:

builder.AddAzureBlobClient(
    "blobs",
    configureClientBuilder: clientBuilder =>
        clientBuilder.ConfigureOptions(
            options => options.Diagnostics.ApplicationId = "myapp"));

statuscontroles voor de Client-integratie

Standaard kunnen .NET.NET Aspire integraties statuscontroles voor alle services inschakelen. Zie .NET.NET Aspire overzicht van integratiesvoor meer informatie.

De .NET AspireAzure Blob Storage-integratie:

  • Hiermee wordt de statuscontrole toegevoegd wanneer AzureStorageBlobsSettings.DisableHealthChecksfalseis, wat probeert verbinding te maken met de Azure Blob Storage.
  • Kan worden geïntegreerd met het /health HTTP-eindpunt, waarmee alle geregistreerde statuscontroles moeten worden doorgegeven zodat de app als gereed wordt beschouwd voor het accepteren van verkeer.

Waarneembaarheid en telemetrie

.NET .NET Aspire integraties stellen automatisch configuraties voor logging, tracing en metingen in, die ook wel bekend staan als de pijlers van observability. Zie .NET.NET Aspire overzicht van integratieintegratiesvoor meer informatie over de waarneembaarheid en telemetrie van integraties. Afhankelijk van de back-upservice ondersteunen sommige integraties mogelijk slechts enkele van deze functies. Sommige integraties ondersteunen bijvoorbeeld logboekregistratie en tracering, maar geen metrische gegevens. Telemetriefuncties kunnen ook worden uitgeschakeld met behulp van de technieken die worden weergegeven in de sectie Configuratie.

Logboekregistratie

De .NET AspireAzure Blob Storage-integratie maakt gebruik van de volgende logboekcategorieën:

  • Azure.Core
  • Azure.Identity

Tracering

De .NET AspireAzure Blob Storage-integratie verzendt de volgende traceringsactiviteiten met behulp van OpenTelemetry:

  • Azure.Storage.Blobs.BlobContainerClient

Statistieken

De .NET AspireAzure Blob Storage-integratie biedt momenteel geen ondersteuning voor metrische gegevens vanwege beperkingen met de Azure SDK.

Zie ook