Anpassen von Verbindungszeichenfolgen mithilfe von .NET Aspire-Manifesten

Abgeschlossen

Bereitstellungstools wie Visual Studio oder die Azure Developer CLI erstellen Manifestdateien, die den Inhalt einer .NET Aspire-Lösung beschreiben. Wenn Sie Ihre Bereitstellung anpassen möchten, können Sie Änderungen direkt an der Manifestdatei vornehmen.

Als Händler für Outdoor-Ausrüstung haben Sie beschlossen, eine vorhandene Azure Cache for Redis-Instanz zu verwenden, um den Ausgabecache für Ihren Web-App-Microservice zu hosten. Sie möchten sicherstellen, dass der Web-App-Dienst eine Verbindung mit der richtigen Instanz von Azure Cache for Redis herstellt.

In dieser Lektion erfahren Sie, wie Sie Verbindungszeichenfolgen in Sicherungsdiensten in der .NET Aspire-Manifestdatei ändern.

Generieren einer Manifestdatei mithilfe der .NET CLI

Während der lokalen Entwicklung und beim Debuggen erstellt .NET Aspire keine Manifestdatei. Bei der Bereitstellung muss .NET den Inhalt der .NET Aspire-Lösung beschreiben, einschließlich ihrer Microservices, Sicherungsdienste und Konfiguration. Die Manifestdatei dient diesem Zweck. Sie beschreibt die Lösung im JSON-Format.

Zum Erstellen der Manifestdatei führen Visual Studio und die Azure Developer CLI einen run-.NET CLI-Befehl mit einem bestimmten Ziel aus. Sie können denselben Befehl auch manuell ausführen, um wie folgt eine eigene Manifestdatei zu erstellen:

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

Hinweis

Stellen Sie sicher, dass Sie das App-Hostprojekt mit der Option --project angeben.

Der Befehl erzeugt eine Ausgabe, die ungefähr folgendem Text entspricht:

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

Sie können auch ein Startprofil verwenden, um den dotnet-Befehl auszuführen. Ein Startprofil ist eine Gruppe von Einstellungen, die ein .NET-Projekt beim Ausführen konfigurieren. Die .NET Aspire Starter-Vorlage erstellt beispielsweise die folgenden Startprofile:

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

Fügen Sie ein Startprofil hinzu, um eine Manifestdatei mit JSON-Code zu erstellen, die dem folgenden Text ähnelt:

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

In Visual Studio können Sie dann das generate-manifest-Profils auswählen, wenn Sie mit dem Debuggen beginnen. Verwenden Sie in der Befehlszeile die Option --launch-profile:

dotnet run --launch-profile generate-manifest

Format der Manifestdatei

Das Manifest ist eine JSON-Datei mit einem einzelnen Element namens resources auf oberster Ebene. Innerhalb dieses Objekts finden Sie für jeden Microservice und Sicherungsdienst ein Objekt. Die Einstellungen jedes dieser Objekte umfassen Verbindungszeichenfolgen, Umgebungsvariablen und Containerimagenamen.

Hier ist ein Beispielmanifest für die .NET Aspire Starter-Vorlage ohne Änderungen. Die Lösung verwendet einen 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
        }
      }
    }
  }
}

Verbindungszeichenfolgen und Bindungsverweise

Im Beispielmanifest gibt es drei Ressourcen:

  • webfrontend: Diese Ressource ist der Microservice, der eine Webschnittstelle für Kunden darstellt.
  • apiservice: Diese Ressource ist die REST-API, die von webfrontend aufgerufen wird. In der Vorlage dient dieser Aufruf zum Abrufen von Wetterdaten.
  • cache: Diese Ressource ist der Redis-Cache, der verwendet wird, um die Leistung des webfrontend-Microservices zu optimieren.

Beachten Sie, dass jede der drei Ressourcen einen bindings-Abschnitt enthält, der Protokolle angibt, die Sie zum Herstellen einer Verbindung mit dieser Ressource verwenden können.

In der Program.cs-Datei des App-Hosts hängt das webfrontend-Projekt sowohl von cache als auch von apiservice ab:

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

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

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

In der Manifestdatei werden diese Abhängigkeiten in Form von Umgebungsvariablen ausgedrückt:

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

Ein Diagramm, das zeigt, wie Abhängigkeiten in einem .NET Aspire-Projekt Verweise in einer Manifestdatei generieren.

Die Abhängigkeiten verwenden Platzhalterzeichenfolgen, die auf die Struktur der Manifestdatei verweisen. Die dritte Abhängigkeit verweist beispielsweise auf die HTTPS-Bindung des API-Diensts:

Ein Diagramm, das zeigt, wie Platzhalter in einer .NET Aspire-Manifestdatei konstruiert sind.

Weitere Informationen