Настройка строка подключения с помощью манифестов .NET Aspire

Завершено

Средства развертывания, такие как Visual Studio или Интерфейс командной строки разработчика Azure, создают файлы манифестов, описывающие содержимое решения .NET Aspire. Если вы хотите настроить развертывание, вы можете внести изменения в файл манифеста напрямую.

Вы решили использовать существующий экземпляр Кэш Azure для Redis для размещения кэша выходных данных для микрослужбы веб-приложения. Необходимо убедиться, что служба веб-приложений подключается к правильному экземпляру Кэш Azure для Redis.

В этом уроке вы узнаете, как изменить строка подключения на резервные службы в файле манифеста .NET Aspire.

Создание файла манифеста с помощью интерфейса командной строки .NET

Во время локальной разработки и отладки .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 можно выбрать профиль создания манифеста при запуске отладки. В командной строке --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: этот ресурс — это микрослужба, которая представляет веб-интерфейс клиентам.
  • apiservice: этот ресурс является REST API, который webfrontend вызывается. В шаблоне этот вызов заключается в получении данных о погоде.
  • cache: этот ресурс — это кэш Redis, используемый для оптимизации webfrontend производительности микрослужбы.

Обратите внимание, что каждый из трех ресурсов содержит раздел, указывающий bindings протоколы, которые можно использовать для подключения к данному ресурсу.

В файле Program.cs узла приложения проект зависит как от того, webfrontend так 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);

В файле манифеста эти зависимости выражаются как переменные среды:

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

Схема, показывающая, как зависимости в проекте .NET Aspire создают ссылки в файле манифеста.

Зависимости используют строки заполнителей, ссылающиеся на структуру файла манифеста. Например, третья зависимость ссылается на привязку HTTPS службы API:

Схема, показывающая, как заполнители создаются в файле манифеста .NET Aspire.

Подробнее