Настройка строка подключения с помощью манифестов .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}"
}
Зависимости используют строки заполнителей, ссылающиеся на структуру файла манифеста. Например, третья зависимость ссылается на привязку HTTPS службы API: