使用 .NET Aspire 資訊清單自訂連接字串

已完成

Visual Studio 或 Azure Developer CLI 等部署工具會建立資訊清單檔,以描述 .NET Aspire 解決方案的內容。 如果您想要自訂部署,則可以直接對資訊清單檔進行變更。

在您的戶外設備零售商中,您已決定使用現有的 Azure Cache for Redis 執行個體來裝載 Web 應用程式微服務的輸出快取。 您想要確保 Web 應用程式服務連線到正確的 Azure Cache for Redis 執行個體。

在本單元中,您將了解如何將連接字串變更為 .NET Aspire 資訊清單檔中的備份服務。

使用 .NET CLI 產生資訊清單檔

在本機開發和偵錯期間,.NET Aspire 不會建立資訊清單檔。 在部署方面,.NET 必須描述 .NET Aspire 解決方案的內容,包括其微服務、備份服務和設定。 資訊清單檔即用於此用途。 它會以 JSON 格式描述解決方案。

若要建立資訊清單檔,Visual Studio 和 Azure Developer CLI 都會執行具有特定目標的 .NET CLI run 命令。 您可以手動執行相同的命令,以建立自己的資訊清單檔,如下所示:

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

注意

請務必使用 --project 選項來指定主控處理程序專案。

此命令會產生類似以下文字的輸出:

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

您也可以使用啟動設定檔來執行 dotnet 命令。 啟動設定檔是一組設定,可在執行時設定 .NET 專案。 例如,.NET Aspire Starter 範本會建立下列啟動設定檔:

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

新增啟動設定檔,以使用類似下列文字的 JSON 程式碼來建立資訊清單檔:

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

在 Visual Studio 中,您可以在開始偵錯時選擇 generate-manifest 設定檔。 在命令列中,使用 --launch-profile 選項:

dotnet run --launch-profile generate-manifest

資訊清單檔的格式

資訊清單是 JSON 檔案,其中包含名為 resources 的單一最上層元素。 在該物件中,您會找到每個微服務和支援服務的一個物件。 針對每個物件,設定包括連接字串、環境變數和容器映像名稱。

以下是 .NET Aspire Starter 範本的未修改範例資訊清單。 解決方案會使用 Redis 快取:

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

連接字串和繫結參考

在資訊清單範例中,有三個資源:

  • webfrontend:此資源是向客戶呈現 Web 介面的微服務。
  • apiservice:此資源是 webfrontend 呼叫的 REST API。 在範本中,此呼叫是取得天氣資料。
  • cache:此資源是 Redis 快取,用來最佳化 webfrontend 微服務的效能。

請注意,這三個資源中的每一個都包含一個 bindings 區段,指定可用來連線到該資源的通訊協定。

在主控處理程序的 Program.cs 檔案中,webfrontend 專案取決於 cacheapiservice

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

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

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

在資訊清單檔中,這些相依性會以環境變數來表示:

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

顯示 .NET Aspire 專案中相依性如何在資訊清單檔中產生參考的圖表。

相依性會使用參考資訊清單檔結構的預留位置字串。 例如,第三個相依性會參考 API 服務 HTTPS 繫結:

顯示 .NET Aspire 資訊清單檔中預留位置建構方式的圖表。

深入了解