Anpassa anslutningssträng med hjälp av .NET Aspire-manifest

Slutförd

Distributionsverktyg som Visual Studio eller Azure Developer CLI skapar manifestfiler som beskriver innehållet i en .NET Aspire-lösning. Om du vill anpassa distributionen kan du göra ändringar i manifestfilen direkt.

I din återförsäljare av utomhusutrustning har du valt att använda en befintlig Azure Cache for Redis-instans som värd för utdatacachen för webbappens mikrotjänst. Du vill se till att webbapptjänsten ansluter till rätt instans av Azure Cache for Redis.

I den här lektionen får du lära dig hur du ändrar anslutningssträng till att säkerhetskopiera tjänster i manifestfilen .NET Aspire.

Generera en manifestfil med hjälp av .NET CLI

Under lokal utveckling och felsökning skapar .NET Aspire inte någon manifestfil. När det gäller distribution måste .NET beskriva innehållet i .NET Aspire-lösningen, inklusive dess mikrotjänster, säkerhetskopieringstjänster och konfiguration. Manifestfilen har det här syftet. Den beskriver lösningen i JSON-format.

För att skapa manifestfilen kör både Visual Studio och Azure Developer CLI ett .NET CLI-kommando run med ett specifikt mål. Du kan köra samma kommando manuellt för att skapa en egen manifestfil så här:

dotnet run --project eShop.AppHost\eShop.AppHost.csproj `
    --publisher manifest `
    --output-path ../aspire-manifest.json

Kommentar

Kontrollera att du anger appvärdprojektet med alternativet --project .

Kommandot genererar utdata som liknar den här texten:

Building...
info: Aspire.Hosting.DistributedApplication[0]
      Aspire version: 8.0.1+a6e341ebbf956bbcec0dda304109815fcbae70c9
info: Aspire.Hosting.Publishing.ManifestPublisher[0]
      Published manifest to: C:\repos\eShop\aspire-manifest.json

Du kan också använda en startprofil för att köra dotnet kommandot. En startprofil är en grupp med inställningar som konfigurerar ett .NET-projekt när det körs. Mallen .NET Aspire Starter skapar till exempel dessa startprofiler:

"profiles": {
  "https": {
    "commandName": "Project",
    "dotnetRunMessages": true,
    "launchBrowser": true,
    "applicationUrl": "https://localhost:17170;http://localhost:15281",
    "environmentVariables": {
      "ASPNETCORE_ENVIRONMENT": "Development",
      "DOTNET_ENVIRONMENT": "Development",
      "DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "https://localhost:21147",
      "DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "https://localhost:22239"
    }
  },
  "http": {
    "commandName": "Project",
    "dotnetRunMessages": true,
    "launchBrowser": true,
    "applicationUrl": "http://localhost:15281",
    "environmentVariables": {
      "ASPNETCORE_ENVIRONMENT": "Development",
      "DOTNET_ENVIRONMENT": "Development",
      "DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "http://localhost:19197",
      "DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "http://localhost:20233"
    }
  }
}

Lägg till en startprofil för att skapa en manifestfil med JSON-kod som liknar den här texten:

"profiles": {
  "generate-manifest": {
    "commandName": "Project",
    "launchBrowser": false,
    "dotnetRunMessages": true,
    "commandLineArgs": "--publisher manifest --output-path aspire-manifest.json"
  }
}

I Visual Studio kan du sedan välja profilen generate-manifest när du börjar felsöka. Använd alternativet på kommandoraden --launch-profile :

dotnet run --launch-profile generate-manifest

Format för manifestfilen

Manifestet är en JSON-fil med ett enda element på den översta nivån med namnet resources. I objektet hittar du ett objekt för varje mikrotjänst och säkerhetskopieringstjänst. För vart och ett av dessa objekt innehåller inställningarna anslutningssträng, miljövariabler och containeravbildningsnamn.

Här är ett exempelmanifest för .NET Aspire Starter-mallen utan ändringar. Lösningen använder en Redis-cache:

{
  "resources": {
    "cache": {
      "type": "container.v0",
      "connectionString": "{cache.bindings.tcp.host}:{cache.bindings.tcp.port}",
      "image": "docker.io/library/redis:7.2",
      "bindings": {
        "tcp": {
          "scheme": "tcp",
          "protocol": "tcp",
          "transport": "tcp",
          "targetPort": 6379
        }
      }
    },
    "apiservice": {
      "type": "project.v0",
      "path": "AspireStarter.ApiService/AspireStarter.ApiService.csproj",
      "env": {
        "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EXCEPTION_LOG_ATTRIBUTES": "true",
        "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EVENT_LOG_ATTRIBUTES": "true",
        "OTEL_DOTNET_EXPERIMENTAL_OTLP_RETRY": "in_memory",
        "ASPNETCORE_FORWARDEDHEADERS_ENABLED": "true"
      },
      "bindings": {
        "http": {
          "scheme": "http",
          "protocol": "tcp",
          "transport": "http"
        },
        "https": {
          "scheme": "https",
          "protocol": "tcp",
          "transport": "http"
        }
      }
    },
    "webfrontend": {
      "type": "project.v0",
      "path": "AspireStarter.Web/AspireStarter.Web.csproj",
      "env": {
        "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EXCEPTION_LOG_ATTRIBUTES": "true",
        "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EVENT_LOG_ATTRIBUTES": "true",
        "OTEL_DOTNET_EXPERIMENTAL_OTLP_RETRY": "in_memory",
        "ASPNETCORE_FORWARDEDHEADERS_ENABLED": "true",
        "ConnectionStrings__cache": "{cache.connectionString}",
        "services__apiservice__http__0": "{apiservice.bindings.http.url}",
        "services__apiservice__https__0": "{apiservice.bindings.https.url}"
      },
      "bindings": {
        "http": {
          "scheme": "http",
          "protocol": "tcp",
          "transport": "http",
          "external": true
        },
        "https": {
          "scheme": "https",
          "protocol": "tcp",
          "transport": "http",
          "external": true
        }
      }
    }
  }
}

Anslutningssträngar och bindningsreferenser

I manifestexemplet finns det tre resurser:

  • webfrontend: Den här resursen är den mikrotjänst som presenterar ett webbgränssnitt för kunderna.
  • apiservice: Den här resursen är rest-API:et som anropas webfrontend . I mallen är det här anropet att hämta väderdata.
  • cache: Den här resursen är Redis-cachen som används för att optimera mikrotjänstens webfrontend prestanda.

Observera att var och en av de tre resurserna innehåller ett bindings avsnitt som anger protokoll som du kan använda för att ansluta till resursen.

I appvärdens Program.cs fil webfrontend beror projektet på både cache :apiservice

var cache = builder.AddRedis("cache");

var apiService = builder.AddProject<Projects.AspireStarter_ApiService>("apiservice");

builder.AddProject<Projects.AspireStarter_Web>("webfrontend")
    .WithExternalHttpEndpoints()
    .WithReference(cache)
    .WithReference(apiService);

I manifestfilen uttrycks dessa beroenden som miljövariabler:

"env": {
  "ConnectionStrings__cache": "{cache.connectionString}",
  "services__apiservice__http__0": "{apiservice.bindings.http.url}",
  "services__apiservice__https__0": "{apiservice.bindings.https.url}"
}

Diagram som visar hur beroenden i ett .NET Aspire-projekt genererar referenser i en manifestfil.

Beroendena använder platshållarsträngar som refererar till manifestfilens struktur. Till exempel refererar det tredje beroendet till API-tjänstens HTTPS-bindning:

Diagram som visar hur platshållare konstrueras i en .NET Aspire-manifestfil.

Läs mer