Поделиться через


Что нового в .NET.NET Aspire 9.0

📢 .NET Aspire 9.0 — следующий основной выпуск общедоступной версии .NET Aspire; он поддерживает обоих:

  • .NET 8.0 долгосрочная поддержка (LTS) или
  • .NET 9.0 Standard Term Support (STS).

Заметка

Вы можете использовать .NET Aspire 9.0 с .NET 8 или .NET 9!

В этом выпуске учитываются некоторые из наиболее запрашиваемых функций и проблемных моментов от сообщества. Лучшие функции создаются сообществом! Чтобы присоединиться к сообществу, посетите нас на Discord, чтобы общаться с участниками команды и сотрудничать с нами на GitHub.

Дополнительные сведения о официальной версии .NET и поддержке версий .NET Aspire см. в следующих разделах:

Обновление до .NET.NET Aspire 9

Чтобы обновить предыдущие версии .NET Aspire до .NET Aspire 9, следуйте инструкциям в официальном руководстве по обновлению до .NET.NET Aspire 9. В руководстве приведены подробные инструкции по обновлению существующих решений .NET Aspire до .NET Aspire 9. Независимо от того, выполняете ли вы это вручную или используете помощник по обновлению, руководство делает краткое описание процесса.

Улучшения инструментов

.NET Aspire 9 упрощает настройку среды для разработки .NET Aspire приложений. Вам больше не нужна нагрузка .NET. Вместо этого вы устанавливаете новый пакет SDK .NET.NET Aspire в проект узла приложения решений .NET.NET Aspire. Для получения дополнительной информации см. .NET.NET Aspire настройку и инструменты.

Шаблоны перемещены

.NET .NET Aspire 9 перемещает содержимое, которое раньше устанавливалось с помощью рабочей нагрузки, в отдельные пакеты NuGet. Сюда входят шаблоны для создания новых проектов и решений .NET.NET Aspire. Эти шаблоны устанавливаются с помощью команды dotnet new install. Их можно установить, выполнив следующую команду:

dotnet new install Aspire.ProjectTemplates::9.0.0

Совет

Если у вас уже установлена .NET.NET Aspire рабочая нагрузка, необходимо передать флаг --force для перезаписи существующих шаблонов. Вы можете смело удалить рабочую нагрузку .NET.NET Aspire.

Дополнительные сведения см. в шаблонах .NET.NET Aspire.

Усовершенствования UX панели и новые интерактивные возможности

Панель управления .NET.NET Aspire продолжает улучшаться с каждым выпуском.

Управление жизненным циклом ресурсов

Наиболее запрошенной функцией панели мониторинга является управление жизненными циклами управляемых именованных ресурсов. В частности, возможность остановить, запустить и перезапустить ресурсы. Эта функция работает для проектов, контейнеров и исполняемых файлов. Он позволяет перезапускать отдельные ресурсы без необходимости перезапускать весь узел приложения. Для ресурсов проекта, когда отладчик подключен, при перезапуске он снова подключается. Дополнительные сведения см. в разделе .NET.NET Aspire панели мониторинга: остановка или запускресурса.

Поддержка мобильных устройств и адаптивного дизайна

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

Конфиденциальные свойства, тома и проверки состояния здоровья в информации о ресурсах

Отображение сведений о ресурсе содержит несколько улучшений:

  • Свойства можно пометить как конфиденциальные, автоматически маскируя их в пользовательском интерфейсе панели мониторинга. Эта функция безопасности помогает избежать случайного раскрытия ключей или паролей при совместном использовании экрана панели мониторинга с другими людьми. Например, аргументы контейнера могут передавать конфиденциальную информацию и поэтому маскируются по умолчанию.

  • В сведениях о ресурсе перечислены настроенные тома контейнеров.

  • .NET .NET Aspire 9 добавляет поддержку проверок работоспособности. Подробные сведения об этих проверках теперь можно просмотреть в области сведений о ресурсе, где показано, почему ресурс может быть помечен как неработоспособный или деградированный. Дополнительные сведения о проверках здоровья здесь.

Красочный журнал консоли

Escape-коды ANSI форматируют текст в терминалах за счет управления цветами (фоновыми и основными) и стилями, такими как жирный, подчеркивание и курсив. Ранее страница журналов консоли информационной панели могла отображать только один код ANSI за раз, что приводило к сбою при объединении нескольких кодов. Например, он может отображать красный текст, но не текст, который был красным и полужирным.

Вклад сообщества от @mangeg улучшил поддержку escape-кодов ANSI и снял это ограничение.

красочные логи консоли

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

Дополнения, ориентированные на пользователей телеметрии

телеметрия остается жизненно важным аспектом .NET.NET Aspire. В .NET.NET Aspire 9 многие новые функции появились в службе телеметрии.

Улучшенная фильтрация телеметрии

Трассы можно фильтровать по значениям атрибутов. Например, если вы хотите просматривать трассировки для одной конечной точки в приложении, атрибут http.route по HTTP-запросам можно отфильтровать по указанному значению.

Фильтрация телеметрии также поддерживает автозавершение существующих значений. Диалоговое окно Добавление фильтра предоставляет раскрывающийся список для выбора из значений, доступных на информационной панели. Эта функция упрощает фильтрацию по реальным данным и помогает избежать опечаток, введя значение самостоятельно.

Для получения дополнительной информации см. панель мониторинга .NET.NET Aspire: фильтруйте трассировки.

Объединение данных телеметрии из нескольких ресурсов

Если ресурс содержит несколько реплик, теперь можно фильтровать данные телеметрии для просмотра данных из всех экземпляров одновременно. Выберите родительский ресурс, помеченный (application). Дополнительные сведения см. на панели мониторинга .NET.NET Aspire: объединение данных телеметрии из нескольких ресурсов.

Поддержка телеметрии браузера

Панель мониторинга поддерживает OpenTelemetry протокол (OTLP) по HTTP и совместное использование ресурсов в кросс-доменном режиме (CORS). Эти функции позволяют отправлять OpenTelemetry из приложений браузера на панель мониторинга .NET Aspire.

Например, одностраничное приложение на основе браузера может настроить JavaScript OpenTelemetry SDK для отправки структурированных журналов, трассировок и метрик, созданных в браузере, на дашборд. Данные телеметрии браузера отображаются вместе с данными телеметрии сервера.

страница детальная трассировки с браузерной телеметрией

Дополнительные сведения о настройке телеметрии браузера см. в документации по включению телеметрии браузера.

Хост приложения (Оркестровка)

Узел приложения является одним из наиболее важных функций . В .NET.NET Aspire 9 были добавлены новые функции, относящиеся к хосту приложения.

Ожидание зависимостей

Если вы следили за .NET.NET Aspire, вы уже знаете, что ваш проект хоста приложения определяет модель приложения. Вы создаете построитель распределенных приложений, добавляете и настраиваете ресурсы и выражаете их зависимости. Теперь можно указать, что ресурс должен ждать другого ресурса перед началом. Это может помочь избежать ошибок подключения во время запуска, только запуская ресурсы, когда их зависимости готовы.

var builder = DistributedApplication.CreateBuilder(args);

var rabbit = builder.AddRabbitMQ("rabbit");

builder.AddProject<Projects.WebApplication1>("api")
       .WithReference(rabbit)
       .WaitFor(rabbit); // Don't start "api" until "rabbit" is ready...

builder.Build().Run();

Когда хост приложения запускается, он ожидает готовности ресурса rabbit перед запуском ресурса api.

Существует два метода, предназначенные для ожидания ресурса:

  • WaitFor. Дождитесь готовности ресурса перед запуском другого ресурса.
  • WaitForCompletion. Дождитесь завершения ресурса перед запуском другого ресурса.

Дополнительные сведения см. в разделе .NET.NET Aspire хосте приложения: ожидание ресурсов.

Проверки работоспособности ресурсов

API WaitFor использует стандартные проверки работоспособности .NET для определения готовности ресурса. Но что означает "готовый ресурс"? Лучшая часть заключается в том, что это настраивается потребителем за пределами значений по умолчанию.

Если ресурс не предоставляет никаких проверок работоспособности (нет проверок работоспособности, зарегистрированных в приложении), хост приложения ожидает, пока ресурс достигнет состояния Running перед запуском зависимого ресурса.

Для ресурсов, которые предоставляют конечные точки HTTP, можно легко добавить проверку работоспособности, которая опрашивает определенный путь на предмет получения ответа HTTP 200.

var builder = DistributedApplication.CreateBuilder(args);

var catalogApi = builder.AddContainer("catalog-api", "catalog-api")
                        .WithHttpEndpoint(targetPort: 8080)
                        .WithHttpHealthCheck("/health");

builder.AddProject<Projects.WebApplication1>("store")
       .WithReference(catalogApi.GetEndpoint("http"))
       .WaitFor(catalogApi);

builder.Build().Run();

В предыдущем примере добавлена проверка работоспособности в ресурс catalog-api. Хост приложения ожидает, пока проверка состояния здоровья не подтвердит успешный статус, прежде чем запустить ресурс store. Он определяет, что ресурс готов, когда конечная точка /health возвращает код состояния HTTP 200.

Пока store ожидает, что catalog-api станет работоспособным, ресурсы на панели мониторинга отображаются следующим образом:

Ожидание неработоспособного ресурса перед запуском

Механизм проверки состояния хоста приложения основан на реализации IHealthChecksBuilder из пространства имен Microsoft.Extensions.Diagnostics.HealthChecks.

Данные отчета о работоспособности, отображаемые на панели мониторинга:

детали проверки состояния в представлении сведений о ресурсах на панели мониторинга

Создание кастомной проверки здоровья — это несложно. Сначала задайте проверку работоспособности, а затем свяжите её имя с любыми ресурсами, для которых она предназначена.

var builder = DistributedApplication.CreateBuilder(args);

var healthyAfter = DateTime.Now.AddSeconds(20);

builder.Services.AddHealthChecks().AddCheck(
    "delay20secs",
    () => DateTime.Now > healthyAfter 
        ? HealthCheckResult.Healthy() 
        : HealthCheckResult.Unhealthy()
    );

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

builder.AddProject<Projects.MyApp>("myapp")
       .WithReference(cache)
       .WaitFor(cache);

В этом примере к ресурсу cache добавляется проверка работоспособности, которая сообщает о его неработоспособности в течение первых 20 секунд после запуска хоста приложения. Таким образом, ресурс myapp ожидает 20 секунд перед запуском, чтобы убедиться в работоспособности ресурса cache.

Методы AddCheck и WithHealthCheck предоставляют простой механизм для создания проверок состояния и связывания их с определенными ресурсами.

Постоянные контейнеры

Теперь узел приложения поддерживает постоянные контейнеры . Контейнеры с постоянным хранением данных отклоняются от типичного жизненного цикла .NET.NET Aspire оркестрированных приложений. Хотя они созданы и запущены (если они еще не доступны) оркестратором .NET Aspire, они не уничтожаются .NET Aspire.

Это полезно, если вы хотите сохранить контейнер запущен даже после остановки узла приложения.

Важный

Чтобы удалить эти контейнеры, необходимо вручную остановить их в среде выполнения контейнеров.

Чтобы определить IResourceBuilder<ContainerResource> с постоянным временем существования, вызовите метод WithLifetime и передайте ContainerLifetime.Persistent:

var builder = DistributedApplication.CreateBuilder(args);

var queue = builder.AddRabbitMQ("rabbit")
                   .WithLifetime(ContainerLifetime.Persistent);

builder.AddProject<Projects.WebApplication1>("api")
       .WithReference(queue)
       .WaitFor(queue);

builder.Build().Run();

На панели мониторинга отображаются постоянные контейнеры со значком закрепления:

постоянные контейнеры

После остановки узла приложения контейнер продолжит выполняться:

Docker отображается на настольном компьютере с RabbitMQ.

Механизм сохраняемости контейнера пытается определить, когда может потребоваться повторно создать контейнер. Например, если среда для контейнера изменяется, контейнер перезагрузится таким образом, чтобы не нужно вручную останавливать контейнер, если входная конфигурация ресурса изменилась.

Команды ресурсов

Хост приложения поддерживает добавление пользовательских команд в ресурсы. Это полезно при добавлении пользовательских функций, которые не поддерживаются узлом приложения. Скорее всего, существует множество возможностей, где полезно будет раскрытие пользовательских методов расширения для ресурсов. .NET .NET Aspire Набор средств сообщества может быть хорошим местом для совместного использования этих расширений.

При определении настраиваемой команды она доступна на панели мониторинга в качестве функции взаимодействия с пользователем.

Важный

Эти команды .NET.NET Aspire панели мониторинга доступны только при локальном запуске панели мониторинга. Они недоступны при запуске панели мониторинга в Azure Container Apps.

Дополнительные сведения о создании пользовательских команд ресурсов см. в статье Практическое руководство. Создание пользовательских команд ресурсов в .NET.NET Aspire.

Сеть контейнеров

Теперь узел приложения добавляет все контейнеры в общую сеть с именем default-aspire-network. Это полезно, если вы хотите взаимодействовать между контейнерами, не проходя через сеть узла. Это также упрощает миграцию из docker compose на узел приложения, так как контейнеры могут взаимодействовать друг с другом с помощью имени контейнера.

Модель событий

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

глобальные события:

  • BeforeStartEvent: событие, которое активируется перед запуском приложения. Это последнее место, где наблюдаются изменения модели приложения. Это выполняется как в режимах запуска, так и в режиме публикации. Это событие блокировки, то есть приложение не запускается до завершения всех обработчиков.
  • AfterResourcesCreatedEvent: событие, которое активируется после создания ресурсов. Это выполняется только в режиме выполнения.
  • AfterEndpointsAllocatedEvent: событие, которое активируется после выделения конечных точек для всех ресурсов. Это выполняется только в режиме выполнения.

Глобальные события аналогичны событиям жизненного цикла узла приложения. Дополнительные сведения о жизненных циклах узла приложений см. в разделе .

события, связанные с каждым ресурсом:

  • BeforeResourceStartedEvent: событие, которое активируется перед запуском одного ресурса. Это выполняется только в режиме выполнения. Это событие блокировки, то есть ресурс не запускается до завершения всех обработчиков.
  • ConnectionStringAvailableEvent: событие, которое активируется при доступности строки подключения для ресурса. Это выполняется только в режиме выполнения.
  • ResourceReadyEvent: событие, которое активируется, когда ресурс готов к использованию. Это выполняется только в режиме выполнения.

Дополнительные сведения см. в разделе События в .NET.NET Aspire.

Интеграции

.NET .NET Aspire продолжает добавлять интеграции, которые упрощают начало работы с любимыми службами и инструментами. Дополнительные сведения см. в обзоре интеграции .NET.NET Aspire.

Инсайт Redis

Поддержка Redis доступна на ресурсе Redis:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddRedis("redis")
       .WithRedisInsight(); // Starts a Redis Insight container image
                            // that is pre-configured to work with the
                            // Redis instance.

Метод расширения WithRedisInsight можно применить к нескольким ресурсам Redis, и они будут отображаться на панели мониторинга Redis Insights.

Панель аналитики Redis с несколькими экземплярами Redis

Дополнительные сведения см. в статье Добавление ресурса Redis с помощью Redis Insights.

OpenAI (предварительная версия)

Начиная с .NET Aspire 9, доступна дополнительная интеграция OpenAI, которая позволяет напрямую использовать последнюю официальную библиотеку dotnet OpenAI. Интеграция клиента регистрирует OpenAIClient как одиночную службу в коллекции служб. Клиент может использоваться для взаимодействия с API OpenAIREST.

  • 📦 Aspire (предварительная версия)

Кроме того, уже доступная интеграция .NET AspireAzureOpenAI была улучшена, чтобы обеспечить гибкий способ настройки OpenAIClient как для службы Azure AI OpenAI, так и для выделенного API OpenAIREST с помощью нового метода конструктора AddOpenAIClientFromConfiguration(IHostApplicationBuilder, String). В следующем примере определяется, относится ли строка подключения к службе AzureAzure AI OpenAI и автоматически регистрирует наиболее подходящий экземпляр OpenAIClient.

builder.AddOpenAIClientFromConfiguration("openai");

Например, если подключение openai выглядело как Endpoint=https://{account}.azure.com;Key={key};, оно может зарегистрировать клиент AzureAzure AI OpenAI из-за доменного имени. В противном случае будет использоваться общий вариант OpenAIClient.

Дополнительные сведения о разрешении клиента, независимом от Azure, см. в.

MongoDB

Добавлена поддержка указания имени пользователя и пароля MongoDB при использовании метода расширения AddMongoDB(IDistributedApplicationBuilder, String, Nullable<Int32>, IResourceBuilder<ParameterResource>, IResourceBuilder<ParameterResource>). Если не указано, создается случайное имя пользователя и пароль, но его можно вручную указать с помощью ресурсов параметров.

var builder = DistributedApplication.CreateBuilder(args);

var username = builder.AddParameter("mongousername");
var password = builder.AddParameter("mongopassword", secret: true);

var db = builder.AddMongo("db", username, password);

Важные Azure улучшения

В следующих разделах описаны улучшения Azure, добавленные в .NET Aspire версии 9. Полный список всех критических изменений см. в разделе Критические изменения в .NET.NET Aspire 9.

настройка ресурсов Azure

В .NET Aspire 8, настройка ресурсов Azure отмечена экспериментальной, так как базовые библиотеки Azure.Provisioning были новыми и собирают отзывы, прежде чем они могут быть отмечены стабильными. В .NET.NET Aspire 9 эти API были обновлены и экспериментальный атрибут был удалён.

изменения, нарушающие совместимость именования ресурсов

В рамках обновления библиотек Azure.Provisioning схема именования по умолчанию для ресурсов Azure была обновлена с более эффективной поддержкой различных политик именования. Однако это обновление привело к изменению имени ресурсов. Новая политика именования может привести к отказу от существующих ресурсов Azure и созданию новых ресурсов Azure после обновления приложения .NET Aspire с 8 до 9. Чтобы использовать те же политики именования из .NET.NET Aspire 8, можно добавить следующий код в Program.csAppHost:

var builder = DistributedApplication.CreateBuilder(args);

builder.Services.Configure<AzureProvisioningOptions>(options =>
{
    options.ProvisioningBuildOptions.InfrastructureResolvers.Insert(0, new AspireV8ResourceNamePropertyResolver());
});

Azure SQL, PostgreSQLи обновление Redis

Azure SQL, PostgreSQLи Redis ресурсы отличаются от других ресурсов Azure, так как существуют локальные ресурсы контейнеров для этих технологий. В .NET Aspire 8, для создания этих Azure ресурсов нужно было начать с локального ресурса-контейнера, а затем применить к нему функции "As" или "PublishAs", превращая его в ресурс Azure. Эта конструкция представила проблемы и не соответствовала другим API.

Например, этот код может быть в .NET.NET Aspire 8:

var builder = DistributedApplication.CreateBuilder(args);

var sql = builder.AddSqlServer("sql")
                 .PublishAsAzureSqlDatabase();

var pgsql = builder.AddPostgres("pgsql")
                   .PublishAsAzurePostgresFlexibleServer();

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

В .NET.NET Aspire 9 эти API были помечены как устаревшие и реализован новый шаблон API:

var builder = DistributedApplication.CreateBuilder(args);

var sql = builder.AddAzureSqlServer("sql")
                 .RunAsContainer();

var pgsql = builder.AddAzurePostgresFlexibleServer("pgsql")
                   .RunAsContainer();

var cache = builder.AddAzureRedis("cache")
                   .RunAsContainer();
Идентификатор Microsoft Entra по умолчанию

Чтобы сделать приложения .NET Aspire более безопасными, база данных Azure для PostgreSQL и Azure Cache for Redis ресурсов была обновлена для использования идентификатора Microsoft Entra ПО умолчанию. Это требует изменений в приложениях, которые должны подключаться к этим ресурсам. Чтобы обновить приложения, чтобы использовать идентификатор Microsoft Entra для подключения к этим ресурсам, ознакомьтесь со следующими сведениями:

В следующих примерах показано, как настроить приложение для подключения к ресурсам Azure с помощью идентификатора Microsoft Entra:

Если вам нужно использовать проверку подлинности паролей или ключа доступа (не рекомендуется), вы можете воспользоваться следующим кодом:

var builder = DistributedApplication.CreateBuilder(args);

var pgsql = builder.AddAzurePostgresFlexibleServer("pgsql")
                   .WithPasswordAuthentication();

var cache = builder.AddAzureRedis("cache")
                   .WithAccessKeyAuthentication();

Поддержка функций Azure (предварительная версия)

Поддержка функций Azure является одной из наиболее часто запрашиваемых на платформе отслеживания проблем .NET.NET Aspire, и мы рады представить её предварительную поддержку в этом выпуске. Чтобы продемонстрировать эту поддержку, давайте использовать .NET.NET Aspire для создания и развертывания вебхука.

Чтобы приступить к работе, создайте проект функций Azure с помощью диалогового окна Visual Studio "Новый проект". При появлении запроса установите флажок Enlist в Aspire оркестрации при создании проекта.

Создание проекта функций .NET AspireAzure.

В проекте узла приложения обратите внимание, что в новом пакете NuGet PackageReference📦присутствует Aspire: .Hosting.Azure.Functions.

<ItemGroup>
    <PackageReference Include="Aspire.Hosting.AppHost" Version="9.0.0" />
    <PackageReference Include="Aspire.Hosting.Azure.Functions" Version="9.0.0" />
</ItemGroup>

Этот пакет предоставляет API AddAzureFunctionsProject<TProject>(IDistributedApplicationBuilder, String), который можно вызвать на узле приложения для настройки проектов функций Azure в узле .NET Aspire:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddAzureFunctionsProject<Projects.PigLatinApp>("piglatinapp");

builder.Build().Run();

В этом примере веб-перехватчик отвечает за перевод входной строки в Pig Latin. Обновите содержимое триггера следующим кодом:

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;
using System.Text;
using FromBodyAttribute = Microsoft.Azure.Functions.Worker.Http.FromBodyAttribute;

namespace PigLatinApp;

public class Function1(ILogger<Function1> logger)
{
    public record InputText(string Value);
    public record PigLatinText(string Value);

    [Function("Function1")]
    public IActionResult Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequest req,
        [FromBody] InputText inputText)
    {
        logger.LogInformation("C# HTTP trigger function processed a request.");

        var result = TranslateToPigLatin(inputText.Value);

        return new OkObjectResult(new PigLatinText(result));
    }

    private static string TranslateToPigLatin(string input)
    {
        if (string.IsNullOrEmpty(input))
        {
            return input;
        }

        var words = input.Split(' ');
        StringBuilder pigLatin = new();

        foreach (string word in words)
        {
            if (IsVowel(word[0]))
            {
                pigLatin.Append(word + "yay ");
            }
            else
            {
                int vowelIndex = FindFirstVowelIndex(word);
                if (vowelIndex is -1)
                {
                    pigLatin.Append(word + "ay ");
                }
                else
                {
                    pigLatin.Append(
                        word.Substring(vowelIndex) + word.Substring(0, vowelIndex) + "ay ");
                }
            }
        }

        return pigLatin.ToString().Trim();
    }

    private static int FindFirstVowelIndex(string word)
    {
        for (var i = 0; i < word.Length; i++)
        {
            if (IsVowel(word[i]))
            {
                return i;
            }
        }
        return -1;
    }

    private static bool IsVowel(char c) =>
        char.ToLower(c) is 'a' or 'e' or 'i' or 'o' or 'u';
}

Установите точку останова в первой строке logger.LogInformation метода Run и нажмите клавишу F5, чтобы запустить хост функций. После запуска панели мониторинга .NET.NET Aspire вы увидите следующее:

снимок экрана .NET Aspire, запущенного с приложением-функцией Azure.

.NET .NET Aspire имеет:

  • Настроили эмулированный ресурс хранилища Azure, который будет использоваться хостом для ведения учета.
  • Локально запущен хост функций с целевым проектом в качестве зарегистрированного проекта функций.
  • Порт, указанный в launchSettings.json функционального проекта для прослушивания.

Используйте избранный HTTP-клиент для отправки запроса в триггер и наблюдения за входными данными, связанными с текстом запроса в отладчике.

curl --request POST \
  --url http://localhost:7282/api/Function1 \
  --header 'Content-Type: application/json' \
  --data '{
  "value": "Welcome to Azure Functions"
}'

снимок экрана панели мониторинга .NET Aspire: отладка приложения-функции Azure.

Теперь вы готовы развернуть наше приложение в Azure Container Apps (ACA). Развертывание в настоящее время зависит от предварительных версий пакетов Azure Functions Worker и Worker SDK. При необходимости обновите версии, на которые ссылается проект Functions:

<ItemGroup>
    <PackageReference Include="Microsoft.Azure.Functions.Worker" Version="2.0.0-preview2" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="2.0.0-preview2" />
</ItemGroup>

Кроме того, необходимо предоставить общедоступную конечную точку для проекта функций Azure, чтобы запросы могли отправляться в триггер HTTP:

builder.AddAzureFunctionsProject<Projects.PigLatinApp>("piglatinapp")
       .WithExternalHttpEndpoints();

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

После установки перейдите в папку, содержащую проект узла приложения, и запустите azd init:

$ azd init

Initializing an app to run on Azure (azd init)

? How do you want to initialize your app? Use code in the current directory

  (✓) Done: Scanning app code in current directory

Detected services:

  .NET (Aspire)
  Detected in: ./PigLatinApp/PigLatinApp.AppHost/PigLatinApp.AppHost.csproj

azd will generate the files necessary to host your app on Azure using Azure Container Apps.

? Select an option Confirm and continue initializing my app
? Enter a new environment name: azfunc-piglatin

Generating files to run your app on Azure:

  (✓) Done: Generating ./azure.yaml
  (✓) Done: Generating ./next-steps.md

SUCCESS: Your app is ready for the cloud!

Затем разверните приложение, выполнив azd up:

$ azd up 
? Select an Azure Subscription to use: 130. [redacted]
? Select an Azure location to use: 50. (US) West US 2 (westus2)

Packaging services (azd package)


Provisioning Azure resources (azd provision)
Provisioning Azure resources can take some time.

Subscription: [redacted]
Location: West US 2

  You can view detailed progress in the Azure Portal:
  [redacted]

  (✓) Done: Resource group: rg-azfunc-piglatin (967ms)
  (✓) Done: Container Registry: [redacted] (13.316s)
  (✓) Done: Log Analytics workspace: [redacted] (16.467s)
  (✓) Done: Container Apps Environment: [redacted] (1m35.531s)
  (✓) Done: Storage account: [redacted] (21.37s)

Deploying services (azd deploy)

  (✓) Done: Deploying service piglatinapp
  - Endpoint: {{endpoint-url}}

  Aspire Dashboard: {{dashboard-url}}

Наконец, протестируйте развернутое приложение Функций с помощью любимого HTTP-клиента:

curl --request POST \
  --url {{endpoint-url}}/api/Function1 \
  --header 'Content-Type: application/json' \
  --data '{
  "value": "Welcome to Azure Functions"
}'

Поддержка функций Azure в .NET Aspire по-прежнему находится в предварительной версии с поддержкой ограниченного набора триггеров, включая:

Дополнительные сведения см. в официальной .NET AspireAzure интеграции функций (предварительная версия).

Настройка Azure Container Apps

Одной из наиболее запрашиваемых функций является возможность настроить Azure Container Apps, которую создает хост приложения, не касаясь Bicep. Это возможно с помощью api PublishAsAzureContainerApp<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure,ContainerApp>) и PublishAsAzureContainerApp<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure,ContainerApp>) в пространстве имен Aspire.Hosting.Azure.AppContainers. Эти методы настраивают определение контейнерного приложения Azure, создаваемого хостом приложения.

Добавьте ссылку на пакет в файл проекта:

<ItemGroup>
  <PackageReference Include="Aspire.Hosting.Azure.AppContainers"
                    Version="9.0.0" />
</ItemGroup>

В следующем примере показано, как масштабировать реплики приложения контейнера Azure до нуля (0).

var builder = DistributedApplication.CreateBuilder(args);

var db = builder.AddAzurePostgresFlexibleServer("pg")
                .RunAsContainer()
                .AddDatabase("db");

// Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed.
#pragma warning disable AZPROVISION001

builder.AddProject<Projects.WebApplication1>("api")
       .WithReference(db)
       .PublishAsAzureContainerApp((module, containerApp) =>
       {
           // Scale to 0
           containerApp.Template.Value!.Scale.Value!.MinReplicas = 0;
       });

#pragma warning restore AZPROVISION001

builder.Build().Run();

Приведенный выше пример кода откладывает создание определения контейнерного приложения Azure на хостинг приложений. Это позволяет вам настраивать определение приложения контейнера Azure без необходимости запускать azd infra synth и небезопасно изменять сгенерированные файлы bicep.

См. также