Condividi tramite


Creare un'app console .NET con Azure Cosmos DB per MongoDB vCore

Questa guida illustra come creare un'applicazione console .NET per connettersi a un cluster vCore di Azure Cosmos DB per MongoDB. È possibile configurare l'ambiente di sviluppo, usare la Azure.Identity libreria di Azure SDK per .NET per eseguire l'autenticazione e interagire con il database per creare, eseguire query e aggiornare i documenti.

Prerequisiti

  • Un cluster esistente di Azure Cosmos DB per MongoDB (vCore).
  • Autenticazione di Microsoft Entra configurata per il cluster con il ruolo dbOwner assegnato alla tua identità.

  • Versione più recente di .NET.

Recuperare i metadati del tenant di Microsoft Entra

Per recuperare un token di accesso usando la TokenCredential classe in Azure.Identity, è necessario l'identificatore univoco per il tenant di Microsoft Entra. In questo passaggio dei prerequisiti, utilizzare l'Azure CLI per recuperare e registrare il valore tenantId.

  1. Ottenere i dettagli per la sottoscrizione di Azure attualmente registrata usando az account show.

    az account show
    
  2. Il comando restituisce una risposta JSON contenente vari campi.

    {
      "environmentName": "AzureCloud",
      "homeTenantId": "eeeeffff-4444-aaaa-5555-bbbb6666cccc",
      "id": "dddd3d3d-ee4e-ff5f-aa6a-bbbbbb7b7b7b",
      "isDefault": true,
      "managedByTenants": [],
      "name": "example-azure-subscription",
      "state": "Enabled",
      "tenantId": "eeeeffff-4444-aaaa-5555-bbbb6666cccc",
      "user": {
        "cloudShellID": true,
        "name": "kai@adventure-works.com",
        "type": "user"
      }
    }
    
  3. Registrare il valore della tenantId proprietà . Questa proprietà è l'identificatore univoco per il tenant di Microsoft Entra e a volte viene definito ID tenant. Questo valore viene usato nei passaggi all'interno di una sezione successiva.

Configurare l'applicazione console

Creare quindi un nuovo progetto di applicazione console e importare le librerie necessarie per l'autenticazione nel cluster.

  1. In una directory vuota creare una nuova applicazione console .NET.

    dotnet new console
    
  2. Importare il Azure.Identity pacchetto da NuGet.

    dotnet add package Azure.Identity
    
  3. Importare quindi il MongoDB.Driver pacchetto.

    dotnet add package MongoDB.Driver
    
  4. Compilare il progetto .NET

    dotnet build
    

Connettersi al cluster

Ora, utilizza la libreria Azure.Identity per ottenere un TokenCredential da utilizzare per connetterti al cluster. Il driver Ufficiale di MongoDB ha un'interfaccia speciale che deve essere implementata per ottenere i token da Microsoft Entra per l'uso durante la connessione al cluster.

  1. Nel file Program.cs, aggiungere blocchi using per questi namespace: Azure.Identity e MongoDB.Driver.

    using Azure.Identity;
    using MongoDB.Driver;
    
  2. Creare una nuova classe in un file separato che implementa tutti i membri necessari dell'interfaccia MongoDB.Driver.Authentication.Oidc.IOidcCallback .

    using Azure.Core;
    using MongoDB.Driver.Authentication.Oidc;
    
    internal sealed class AzureIdentityTokenHandler(
        TokenCredential credential,
        string tenantId
    ) : IOidcCallback
    {
        private readonly string[] scopes = ["https://ossrdbms-aad.database.windows.net/.default"];
    
        public OidcAccessToken GetOidcAccessToken(OidcCallbackParameters parameters, CancellationToken cancellationToken)
        {
            AccessToken token = credential.GetToken(
                new TokenRequestContext(scopes, tenantId: tenantId),
                cancellationToken
            );
    
            return new OidcAccessToken(token.Token, token.ExpiresOn - DateTimeOffset.UtcNow);
        }
    
        public async Task<OidcAccessToken> GetOidcAccessTokenAsync(OidcCallbackParameters parameters, CancellationToken cancellationToken)
        {
            AccessToken token = await credential.GetTokenAsync(
                new TokenRequestContext(scopes, parentRequestId: null, tenantId: tenantId),
                cancellationToken
            );
    
            return new OidcAccessToken(token.Token, token.ExpiresOn - DateTimeOffset.UtcNow);
        }
    }
    

    Suggerimento

    Ai fini illustrativi, questa classe è denominata AzureIdentityTokenHandler. È possibile assegnare a questa classe qualsiasi nome desiderato. Nella parte restante di questa guida si presuppone che la classe sia denominata AzureIdentityTokenHandler.

  3. Tornare all'editor per il file Program.cs .

  4. Creare una variabile stringa con il nome del cluster esistente. Usare quindi tale variabile per creare una nuova istanza di tipo MongoUrl usando MongoUrl.Create

    string clusterName = "<azure-cosmos-db-mongodb-vcore-cluster-name>";
    
    MongoUrl url = MongoUrl.Create($"mongodb+srv://{clusterName}.global.mongocluster.cosmos.azure.com/");
    
  5. Configurare una nuova MongoSettings istanza usando il MongoUrl creato nei passaggi precedenti e la configurazione della procedura consigliata standard per Azure Cosmos DB per MongoDB vCore.

    MongoClientSettings settings = MongoClientSettings.FromUrl(url);
    
    settings.UseTls = true;
    settings.RetryWrites = false;
    settings.MaxConnectionIdleTime = TimeSpan.FromMinutes(2);
    
  6. Creare una nuova credenziale di tipo DefaultAzureCredential.

    DefaultAzureCredential credential = new();
    

    Suggerimento

    Qui è possibile usare qualsiasi credenziale di tipo TokenCredential . DefaultAzureCredential è l'opzione più semplice per gli scenari di sviluppo iniziali.

  7. Creare una nuova istanza della classe che implementa IOidcCallback e configurarla con l'ID tenant registrato in precedenza in questa guida.

    string tenantId = "<microsoft-entra-tenant-id>";
    
    AzureIdentityTokenHandler tokenHandler = new(credential, tenantId);
    
  8. Configura la credenziale per le tue impostazioni usando MongoCredential.CreateOidcCredential e passando l'implementazione del callback del gestore personalizzato.

    settings.Credential = MongoCredential.CreateOidcCredential(tokenHandler);
    
  9. Bloccare le impostazioni e quindi creare una nuova istanza di MongoClient.

    settings.Freeze();
    
    MongoClient client = new(settings);
    
    Console.WriteLine("Client created");
    

Eseguire operazioni comuni

Infine, usare la libreria ufficiale per eseguire attività comuni con database, raccolte e documenti. In questo caso si usano le stesse classi e metodi usati per interagire con MongoDB o DocumentDB per gestire le raccolte e gli elementi.

  1. Rappresentare i documenti creando un tipo di record personalizzato nel proprio file.

    public record Product(
        string id,
        string category,
        string name,
        int quantity,
        decimal price,
        bool clearance
    );
    

    Suggerimento

    A scopo illustrativo, questo struct è denominato Product. Nella parte restante di questa guida si presuppone che questo struct sia già definito.

  2. Tornare al file di Program.cs .

  3. Ottieni un puntatore al tuo database usando MongoClient.GetDatabase.

    string databaseName = "<database-name>";
    
    IMongoDatabase database = client.GetDatabase(databaseName);
    
    Console.WriteLine("Database pointer created"); 
    
  4. Quindi, utilizza il puntatore del database per ottenere un puntatore alla tua raccolta usando IMongoDatabase.GetCollection<>.

    string collectionName = "<collection-name>";
    
    IMongoCollection<Product> collection = database.GetCollection<Product>(collectionName);
    
    Console.WriteLine("Collection pointer created"); 
    
  5. Creare ed effettuare un upsert di due documenti utilizzando il metodo .

    Product classicSurfboard = new(
        id: "bbbbbbbb-1111-2222-3333-cccccccccccc",
        category: "gear-surf-surfboards",
        name: "Kiama Classic Surfboard",
        quantity: 25,
        price: 790.00m,
        clearance: false
    );
    
    Product paddleKayak = new(
        id: "cccccccc-2222-3333-4444-dddddddddddd",
        category: "gear-paddle-kayaks",
        name: "Lastovichka Paddle Kayak",
        quantity: 10,
        price: 599.99m,
        clearance: true
    );
    
    await collection.ReplaceOneAsync<Product>(
        doc => doc.id == classicSurfboard.id,
        classicSurfboard,
        new ReplaceOptions { IsUpsert = true }
    );
    
    Console.WriteLine($"Upserted document:\t{classicSurfboard.id}");
    
    await collection.ReplaceOneAsync<Product>(
        doc => doc.id == paddleKayak.id,
        paddleKayak,
        new ReplaceOptions { IsUpsert = true }
    );
    
    Console.WriteLine($"Upserted document:\t{paddleKayak.id}");
    
  6. Leggere un singolo documento dalla raccolta usando IMongoCollection<>.Find e IFindFluent<,>.SingleAsync. Usare un filtro per specificare il documento specifico da trovare.

    Product document = await collection.Find(
        doc => doc.id == "cccccccc-2222-3333-4444-dddddddddddd"
    ).SingleAsync();
    
    Console.WriteLine($"Found document:\t{document.name}");
    
  7. Eseguire una query per tutti i documenti che corrispondono a un filtro usando lo stesso Find metodo. Usare un filtro per definire una proprietà specifica ( ad esempio category) e un valore specifico (ad esempio gear-surf-surfboards). Enumerare i risultati usando IFindFluent<,>.ToListAsync.

    List<Product> documents = await collection.Find(
        doc => doc.category == "gear-surf-surfboards"
    ).ToListAsync();
    
    foreach (Product doc in documents)
    {
        Console.WriteLine($"Queried document:\t{doc}");
    }
    
  8. Eliminare un documento specifico dalla raccolta utilizzando IMongoCollection<>.DeleteOneAsync e un filtro.

    await collection.DeleteOneAsync(
        doc => doc.id == "bbbbbbbb-1111-2222-3333-cccccccccccc"
    );
    
    Console.WriteLine($"Deleted document");
    
  9. Salvare tutti i file di codice nel progetto.

  10. Eseguire il progetto usando dotnet run

    dotnet run
    
  11. Osservare l'output dell'applicazione in esecuzione.

    Client created
    Database pointer created
    Collection pointer created
    Upserted document:      bbbbbbbb-1111-2222-3333-cccccccccccc
    Upserted document:      cccccccc-2222-3333-4444-dddddddddddd
    Found document: Lastovichka Paddle Kayak
    Queried document:       Product { id = bbbbbbbb-1111-2222-3333-cccccccccccc, category = gear-surf-surfboards, name = Kiama Classic Surfboard, quantity = 25, price = 790.00, clearance = False }
    Deleted document