Udostępnij za pośrednictwem


integracja usługi .NET AspireAzure Queue Storage

obejmuje:integrację hostingu oraz integrację Client

Azure Queue Storage to usługa do przechowywania dużej liczby komunikatów, do których można uzyskiwać dostęp z dowolnego miejsca na świecie za pośrednictwem uwierzytelnionych wywołań. Integracja usługi .NET AspireAzure Queue Storage umożliwia łączenie się z istniejącymi wystąpieniami usługi Queue Storage Azure lub tworzenie nowych wystąpień z poziomu aplikacji .NET.

Integracja hostingu

.NET .NET Aspire Azure Storage integracja hostingu modeluje różne zasoby magazynu jako następujące typy:

Aby uzyskać dostęp do tych typów i interfejsów API do ich wyrażania, dodaj pakiet NuGet 📦Aspire.Hosting.Azure.Storage w projekcie hosta aplikacji .

dotnet add package Aspire.Hosting.Azure.Storage

Aby uzyskać więcej informacji, zobacz dotnet add package lub Zarządzaj zależnościami pakietów w aplikacjach .NET.

Dodawanie zasobu usługi Azure Storage

W projekcie hosta aplikacji wywołaj AddAzureStorage, aby dodać i zwrócić konstruktor zasobów Azure Storage.

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...

Po dodaniu AzureStorageResource do hosta aplikacji uwidacznia inne przydatne interfejsy API do dodawania Azure zasobów obiektów blob, kolejek i usługi Table Storage. Innymi słowy, należy dodać AzureStorageResource przed dodaniem dowolnych innych zasobów magazynowych.

Ważny

Kiedy wywołujesz AddAzureStorage, niejawnie wywołuje AddAzureProvisioning, co umożliwia obsługę dynamicznego generowania zasobów Azure podczas uruchamiania aplikacji. Aplikacja musi skonfigurować odpowiednią subskrypcję i lokalizację. Aby uzyskać więcej informacji, zobacz Lokalne udostępnianie: Konfiguracja.

Wygenerowane udostępnianie Bicep

Jeśli dopiero zaczynasz z Bicep, to jest język specyficzny dla domeny służący do definiowania zasobów Azure. W przypadku .NET.NET Aspirenie musisz pisać Bicep ręcznie; zamiast tego interfejsy API do aprowizacji generują Bicep za Ciebie. Podczas publikowania aplikacji wygenerowany Bicep jest wyświetlany wraz z plikiem manifestu. Po dodaniu zasobu usługi Azure Storage jest generowany następujący kod Bicep:


przełącz 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

Poprzedni Bicep to moduł, który tworzy konto usługi Azure Storage z następującymi wartościami domyślnymi.

  • kind: Rodzaj konta magazynowego. Wartość domyślna to StorageV2.
  • sku: jednostka SKU konta magazynu. Wartość domyślna to Standard_GRS.
  • properties: właściwości konta magazynowego:
    • accessTier: warstwa dostępu konta przechowywania. Wartość domyślna to Hot.
    • allowSharedKeyAccess: wartość logiczna wskazująca, czy konto magazynu zezwala na autoryzację żądań przy użyciu klucza dostępu do konta. Wartość domyślna to false.
    • minimumTlsVersion: minimalna obsługiwana wersja protokołu TLS dla konta przechowywania. Wartość domyślna to TLS1_2.
    • networkAcls: Listy kontroli dostępu sieciowego dla konta magazynowego. Wartość domyślna to { defaultAction: 'Allow' }.

Oprócz konta magazynu, tworzy również kontener obiektów blob.

Następujące przypisania ról są dodawane do konta magazynowego, aby zapewnić dostęp do twojej aplikacji. Aby uzyskać więcej informacji, zobacz Azure wbudowane role kontroli dostępu opartej na rolach (Azure kontroli dostępu opartej na rolach):

Rola i identyfikator Opis
Współautor danych obiektu blob usługi Storage
ba92f5b4-2d11-453d-a403-e96b0029c9fe
Odczytywanie, zapisywanie i usuwanie kontenerów i obiektów blob usługi Storage Azure.
Współautor danych tabeli Storage
0a9a7e1f-b9d0-4cc4-a60d-0319b160aaa3
Odczytywanie, zapisywanie i usuwanie tabel i jednostek usługi Storage Azure.
Współtwórca danych kolejki Storage
974c5e8b-45b9-4653-ba55-5f855dd0fb88
Odczytywanie, zapisywanie i usuwanie kolejek Azure usługi Storage oraz komunikatów w kolejkach.

Wygenerowany Bicep jest punktem wyjścia i można go dopasować, aby spełnić Twoje konkretne wymagania.

Dostosowywanie infrastruktury aprowizacji

Wszystkie zasoby .NET AspireAzure to podklasy typu AzureProvisioningResource. Ten typ umożliwia dostosowanie wygenerowanego kodu Bicep, zapewniając płynny interfejs API do konfigurowania zasobów Azure przy użyciu API ConfigureInfrastructure<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure>). Można na przykład skonfigurować kind, sku, propertiesoraz inne. W poniższym przykładzie pokazano, jak dostosować zasób Azure Storage:

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

Powyższy kod:

Dostępnych jest wiele innych opcji konfiguracji umożliwiających dostosowanie zasobu usługi Azure Storage. Aby uzyskać więcej informacji, zobacz Azure.Provisioning.Storage.

Nawiązywanie połączenia z istniejącym kontem usługi Azure Storage

Być może masz istniejące konto usługi Azure Storage, z którym chcesz nawiązać połączenie. Zamiast reprezentować nowy zasób usługi Azure Storage, możesz dodać ciąg połączenia do hosta aplikacji. Aby dodać połączenie z istniejącym kontem usługi Azure Storage, wywołaj metodę AddConnectionString:

var builder = DistributedApplication.CreateBuilder(args);

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

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

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

Notatka

Parametry połączenia służą do reprezentowania szerokiego zakresu informacji o połączeniu, w tym połączeń z bazą danych, brokerów komunikatów, identyfikatorów URI punktów końcowych i innych usług. W .NET.NET Aspire nomenklaturze termin "parametry połączenia" służy do reprezentowania wszelkich informacji o połączeniu.

Parametry połączenia są konfigurowane w konfiguracji hosta aplikacji, zazwyczaj w obszarze Wpisy tajne użytkownikaw sekcji ConnectionStrings. Host aplikacji wprowadza te parametry połączenia jako zmienną środowiskową do wszystkich zasobów zależnych, na przykład:

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

Zasób zależny może uzyskać dostęp do wstrzykiwanych parametrów połączenia, wywołując metodę GetConnectionString i przekazując nazwę połączenia jako parametr, w tym przypadku "blobs". Interfejs API GetConnectionString jest skrócony dla IConfiguration.GetSection("ConnectionStrings")[name].

Dodawanie zasobu emulatora usługi Azure Storage

Aby dodać zasób emulatora usługi Azure Storage, połącz wywołanie IResourceBuilder<AzureStorageResource> z interfejsem API RunAsEmulator:

var builder = DistributedApplication.CreateBuilder(args);

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

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

Gdy wywołasz RunAsEmulator, program konfiguruje Twoje zasoby magazynowe do uruchamiania lokalnego przy użyciu emulatora. Emulator w tym przypadku jest Azurite. Emulator open-source usługi Azurite udostępnia bezpłatne środowisko lokalne do testowania Azure aplikacji Blob, Queue Storage i Table Storage oraz jest doskonałym towarzyszem integracji .NET AspireAzure hostingu. Azurite nie jest zainstalowane, lecz jest dostępne jako kontener dla .NET.NET Aspire. Po dodaniu kontenera do hosta aplikacji, jak pokazano w poprzednim przykładzie z obrazem mcr.microsoft.com/azure-storage/azurite, tworzy i uruchamia kontener po uruchomieniu hosta aplikacji. Aby uzyskać więcej informacji, zobacz Cykl życia zasobów kontenera.

Konfigurowanie kontenera Azurite

Istnieją różne konfiguracje dostępne dla zasobów kontenera, na przykład można skonfigurować porty kontenera, zmienne środowiskowe, jego czas życiai inne.

Konfigurowanie portów kontenera Azurite

Domyślnie kontener Azurite skonfigurowany przez .NET.NET Aspireuwidacznia następujące punkty końcowe:

Punkt końcowy Port kontenerowy Port hosta
blob 10000 dynamiczny
queue 10001 dynamiczny
table 10002 dynamiczny

Port, na którym nasłuchują, jest dynamiczny domyślnie. Po uruchomieniu kontenera porty są mapowane na losowy port na maszynie hosta. Aby skonfigurować porty punktu końcowego, użyj łańcucha wywołań na budowniczym zasobów kontenera dostarczonym przez metodę RunAsEmulator, jak pokazano w poniższym przykładzie:

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...

Powyższy kod konfiguruje istniejące punkty końcowe blob, queuei table kontenera Azurite do nasłuchiwania na portach 27000, 27001i 27002odpowiednio. Porty kontenera Azurite są mapowane na porty hosta, jak pokazano w poniższej tabeli:

Nazwa punktu końcowego Mapowanie portów (container:host)
blob 10000:27000
queue 10001:27001
table 10002:27002
Konfigurowanie kontenera Azurite z trwałym okresem istnienia

Aby skonfigurować kontener Azurite z trwałym okresem istnienia, wywołaj metodę WithLifetime w zasobie kontenera Azurite i przekaż ContainerLifetime.Persistent:

var builder = DistributedApplication.CreateBuilder(args);

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

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

Aby uzyskać więcej informacji, zobacz okres istnienia zasobu kontenera.

Konfigurowanie kontenera Azurite za pomocą woluminu danych

Aby dodać wolumin danych do zasobu emulatora usługi Azure Storage, wywołaj metodę WithDataVolume w zasobie emulatora usługi Azure Storage:

var builder = DistributedApplication.CreateBuilder(args);

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

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

Wolumin danych jest używany do utrwalania danych Azurite poza cyklem życia kontenera. Wolumin danych jest instalowany w ścieżce /data w kontenerze Azurite, a gdy nie podano parametru name, nazwa jest sformatowana jako .azurite/{resource name}. Aby uzyskać więcej informacji na temat woluminów danych i szczegółów na temat tego, dlaczego są preferowane w przypadku instalacji wiązania, zobacz Docker dokumentacji: woluminy.

Konfigurowanie kontenera Azurite przy użyciu punktu montowania danych

Aby dodać instalację powiązania danych do zasobu emulatora usługi Azure Storage, wywołaj metodę WithDataBindMount:

var builder = DistributedApplication.CreateBuilder(args);

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

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

Ważny

Instalacje powiązane danych mają ograniczoną funkcjonalność w porównaniu z woluminami , co zapewnia lepszą wydajność, przenośność i bezpieczeństwo, co czyni je bardziej odpowiednimi dla środowisk produkcyjnych. Jednak monity bind umożliwiają bezpośredni dostęp i modyfikację plików w systemie hosta, co jest idealne do rozwoju i testowania, gdy potrzebne są zmiany w czasie rzeczywistym.

Instalacje powiązania danych polegają na systemie plików maszyny hosta w celu utrwalania danych Azurite między ponownymi uruchomieniami kontenera. Instalacja powiązania danych jest instalowana w ścieżce ../Azurite/Data na maszynie hosta względem katalogu hosta aplikacji (IDistributedApplicationBuilder.AppHostDirectory) w kontenerze Azurite. Aby uzyskać więcej informacji na temat instalacji powiązań danych, zobacz Docker docs: Bind mounts.

Łączenie z zasobami przechowywania

Po uruchomieniu hosta aplikacji .NET.NET Aspire zasoby magazynu mogą być dostępne za pomocą narzędzi zewnętrznych, takich jak Azure Storage Explorer. Jeśli zasób magazynowy działa lokalnie z wykorzystaniem Azurite, Azure Storage Explorer automatycznie go wykryje.

Notatka

Eksplorator Azure Storage odnajduje zasoby Azurite, zakładając, że używane są porty domyślne. Jeśli skonfigurowano kontener Azurite do używania różnych portów, należy skonfigurować eksploratora usługi Azure Storage, aby nawiązać połączenie z odpowiednimi portami.

Aby nawiązać połączenie z zasobem magazynu z poziomu eksploratora usługi Azure Storage, wykonaj następujące kroki:

  1. Uruchom hosta aplikacji .NET.NET Aspire.

  2. Otwórz Eksploratora usługi Azure Storage.

  3. Wyświetl okienko Eksploratora .

  4. Wybierz link Odśwież wszystkie, aby odświeżyć listę kont magazynowych.

  5. Rozwiń węzeł Emulator & Dołączony.

  6. Rozwiń węzeł Konta magazynowe.

  7. Powinieneś zobaczyć konto magazynowania, którego nazwa zaczyna się od nazwy twojego zasobu.

    Azure Eksplorator magazynu: odnaleziono zasób magazynowy Azurite.

Możesz swobodnie eksplorować konto magazynu i jego zawartość, korzystając z Eksploratora magazynu Azure. Aby uzyskać więcej informacji na temat korzystania z Eksploratora usługi Azure Storage, zobacz Wprowadzenie do Eksploratora usługi Storage.

Dodawanie zasobu usługi Queue Storage Azure

W projekcie hosta aplikacji zarejestruj integrację usługi Azure Queue Storage, łącząc wywołanie AddQueues w wystąpieniu IResourceBuilder<IAzureStorageResource> zwróconym przez AddAzureStorage. W poniższym przykładzie pokazano, jak dodać zasób usługi Queue Storage Azure o nazwie storage i zasób kolejki o nazwie queues:

var builder = DistributedApplication.CreateBuilder(args);

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

builder.AddProject<Projects.ExampleProject>()
       .WithReference(queues);

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

Powyższy kod:

  • Dodaje zasób usługi Azure Storage o nazwie storage.
  • Dodaje kolejkę o nazwie queues do zasobu magazynu.
  • Dodaje zasób storage do ExampleProject i czeka, aż będzie gotowy przed rozpoczęciem projektu.

Monitorowanie kondycji integracji systemów

Integracja hostingu usługi Azure Storage automatycznie dodaje kontrolę stanu zasobu pamięci. Jest on dodawany tylko w przypadku uruchamiania jako emulator i sprawdza, czy kontener Azurite jest uruchomiony i że można nawiązać z nim połączenie. Integracja hostingu opiera się na pakiecie NuGet 📦 AspNetCore.HealthChecks.Azure.Storage.Blobs.

integracja Client

Aby rozpocząć pracę z integracją usługi .NET AspireAzure Queue Storage client, zainstaluj pakiet NuGet 📦Aspire.Azure.Storage.Queues w projekcie zużywającym client, to znaczy, w projekcie dla aplikacji korzystającej z usługi Azure Queue Storage client. Integracja Azure Queue Storage client rejestruje instancję QueueServiceClient, której można użyć do interakcji z Azure Queue Storage.

dotnet add package Aspire.Azure.Storage.Queues

Dodaj Azure Queue Storage client

W pliku Program.cs projektu korzystającego z clientwywołaj metodę rozszerzenia AddAzureQueueClient na dowolnym IHostApplicationBuilder, aby zarejestrować QueueServiceClient do użycia za pośrednictwem kontenera wstrzykiwania zależności. Metoda przyjmuje parametr nazwy połączenia.

builder.AddAzureQueueClient("queue");

Następnie można pobrać wystąpienie QueueServiceClient za pomocą wstrzykiwania zależności. Aby na przykład pobrać client z usługi:

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

Konfiguracja

Integracja .NET AspireAzure Queue Storage oferuje wiele opcji konfigurowania QueueServiceClient na podstawie wymagań i konwencji projektu.

Używanie parametrów połączenia

W przypadku używania parametrów połączenia z sekcji konfiguracji ConnectionStrings można podać nazwę parametrów połączenia podczas wywoływania AddAzureQueueClient:

builder.AddAzureQueueClient("queue");

Następnie parametry połączenia są pobierane z sekcji konfiguracji ConnectionStrings, a obsługiwane są dwa formaty połączenia:

URI usługi

Zalecaną metodą jest użycie ServiceUri, która współpracuje z właściwością AzureStorageQueuesSettings.Credential w celu nawiązania połączenia. Jeśli nie skonfigurowano poświadczeń, zostanie użyta Azure.Identity.DefaultAzureCredential.

{
  "ConnectionStrings": {
    "queue": "https://{account_name}.queue.core.windows.net/"
  }
}
Ciąg połączenia

Alternatywnie można użyć ciągu połączenia Azure Storage.

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

Aby uzyskać więcej informacji, zobacz Configure Azure Storage connection strings.

Korzystanie z dostawców konfiguracji

Integracja usługi .NET AspireAzure Queue Storage obsługuje Microsoft.Extensions.Configuration. Ładuje AzureStorageQueuesSettings i QueueClientOptions z konfiguracji przy użyciu klucza Aspire:Azure:Storage:Queues. Poniższy fragment kodu to przykład pliku appsettings.json, który konfiguruje niektóre opcje:

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

Aby uzyskać pełny schemat integracji Azure Storage QueuesclientJSON, zobacz: ,Aspire,Azure, Data.Queues/ConfigurationSchema,json,.

Używanie delegatów wbudowanych

Możesz również przekazać delegata Action<AzureStorageQueuesSettings> configureSettings, aby skonfigurować niektóre lub wszystkie opcje w linii, na przykład do konfiguracji kontroli kondycji:

builder.AddAzureQueueClient(
    "queue",
    settings => settings.DisableHealthChecks = true);

Można również skonfigurować QueueClientOptions przy użyciu delegata Action<IAzureClientBuilder<QueueServiceClient, QueueClientOptions>> configureClientBuilder, drugiego parametru metody AddAzureQueueClient. Na przykład, aby ustawić pierwszą część nagłówków User-Agent dla wszystkich wysyłanych żądań w tym client:

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

Client kontrole stanu zdrowia integracji

Domyślnie .NET.NET Aspire integracje włączają kontrole kondycji dla wszystkich usług. Aby uzyskać więcej informacji, zobacz omówienie integracji .NET.NET Aspire.

Integracja .NET AspireAzure Queue Storage:

  • Dodaje kontrolę kondycji, gdy AzureStorageQueuesSettings.DisableHealthChecks jest false, która próbuje nawiązać połączenie z usługą Azure Queue Storage.
  • Integruje się z punktem końcowym HTTP /health, który określa, że wszystkie zarejestrowane kontrole zdrowia muszą zostać pomyślnie zakończone, aby aplikacja została uznana za gotową do akceptowania ruchu.

Obserwowanie i telemetria

.NET .NET Aspire integracje automatycznie konfigurują konfiguracje rejestrowania, śledzenia i metryk, które są czasami nazywane filarami możliwości obserwowania. Aby uzyskać więcej informacji na temat możliwości obserwacji integracji i telemetrii, zobacz omówienie integracji .NET.NET Aspire. W zależności od usługi pomocniczej niektóre integracje mogą obsługiwać tylko niektóre z tych funkcji. Na przykład niektóre integracje obsługują rejestrowanie i śledzenie, ale nie metryki. Funkcje telemetrii można również wyłączyć przy użyciu technik przedstawionych w sekcji konfiguracji .

Logowanie

Integracja usługi .NET AspireAzure Queue Storage używa następujących kategorii dzienników:

  • Azure.Core
  • Azure.Identity

Śledzenie

Integracja usługi .NET AspireAzure Queue Storage generuje następujące działania śledzenia przy użyciu OpenTelemetry:

  • Azure.Storage.Queues.QueueClient

Metryki

Obecnie integracja .NET AspireAzure Queue Storage nie obsługuje metryk domyślnie z powodu ograniczeń w SDK Azure.

Zobacz też