.NET .NET Aspire 9.0 中的新增功能

📢 .NET Aspire 9.0 是 .NET Aspire的下一个主要版本正式发布,它支持 两个

  • .NET 8.0 长期支持(LTS)
  • .NET 9.0 标准术语支持(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 工作负荷。 而是将新的 .NET.NET Aspire SDK 安装到 .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 应用程序进行实时管理。 我们进行了其他无障碍功能改进,包括在移动设备上显示设置和内容溢出。

资源详细信息中的敏感属性、卷和健康检查

资源详细信息的显示包含多项改进:

  • 属性可以标记为敏感,并在仪表板 UI 中自动屏蔽它们。 此安全功能有助于避免在与其他人共享仪表板时意外泄露密钥或密码。 例如,容器参数可以传递敏感信息,因此默认屏蔽。

  • 容器卷的配置在资源详细信息中列出。

  • .NET .NET Aspire 9 添加了对健康检查的支持。 现在可以在资源详细信息窗格中查看有关这些检查的详细信息,显示资源可能标记为不正常或降级的原因。 有关详细信息,请参阅 资源运行状况检查

彩色控制台日志

ANSI 转义代码 通过控制颜色(前景和背景)以及粗体、下划线和斜体等样式来设置终端中的文本格式。 以前,仪表板的控制台日志页面只能渲染一个 ANSI 转义代码,当同时出现多个代码时便会失败。 例如,它可以显示红色文本,但不能显示既红色又加粗的文本。

来自社区成员 @mangeg 的贡献改进了对 ANSI 转义代码的支持,并删除了此限制。

彩色控制台日志

控制台日志的另一项改进是隐藏不受支持的转义代码。 与显示文本无关的代码(例如定位光标或与操作系统通信)在此 UI 中没有意义,并且隐藏。

用户为中心的遥测功能增强

遥测 仍然是 .NET.NET Aspire的重要方面。 .NET .NET Aspire 9 中,遥测服务引入了许多新功能。

改进了遥测筛选

可以通过属性值筛选跟踪信息。 例如,如果只想在应用中查看一个终结点的跟踪,则可以将 HTTP 请求上的 http.route 属性筛选为指定值。

遥测筛选还支持自动补全现有值。 添加筛选器 对话框提供了一个组合框,用于从仪表板可用的值中进行选择。 使用此功能,您可以更轻松地筛选出真实数据,并帮助避免在自己输入值时出现拼写错误。

有关详细信息,请参阅 .NET.NET Aspire 仪表板:筛选跟踪

合并来自多个资源的遥测数据

当资源有多个副本时,现在可以筛选遥测数据,一次性查看所有实例中的数据。 选择标记为 (application)的父资源。 有关详细信息,请参阅 .NET.NET Aspire 仪表板:合并来自多个资源的遥测数据。

浏览器遥测支持

仪表板支持 OpenTelemetry 协议(OTLP)通过 HTTP 和跨源资源共享(CORS)。 这些功能可解锁将 OpenTelemetry 从浏览器应用发送到 .NET Aspire 仪表板的功能。

例如,基于浏览器的单页应用(SPA)可以配置 JavaScript OpenTelemetry SDK,以将浏览器中创建的结构化日志、跟踪和指标发送到仪表板。 浏览器遥测与服务器遥测一起显示。

使用浏览器遥测的跟踪详细信息页

有关配置浏览器遥测的详细信息,请参阅 启用浏览器遥测 文档。

应用主机(编排)

.NET .NET Aspire 应用主机.NET 的 .NET Aspire 功能之一。 在 .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 应用主机:正在等待资源

资源健康状况检查

WaitFor API 使用标准 .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 资源正常运行。

AddCheckWithHealthCheck 方法提供了一种简单的机制来创建健康检查并将其与特定资源相关联。

永久性容器

应用主机现在支持 持久性 容器。 永久性容器偏离了由.NET.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 Community Toolkit 可能会是共享这些扩展的好地方。

定义自定义命令时,仪表板中提供该命令作为用户体验功能。

重要

这些 .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 Insights 的支持在 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 Insight 仪表板上可见。

Redis 分析仪表板,其中显示了多个 Redis 实例

有关详细信息,请参阅 添加 Redis 资源,其中包含 Redis Insights

OpenAI(预览版)

从 .NET Aspire 9 开始,提供了额外的 OpenAI 集成,它允许直接使用最新的官方 OpenAI dotnet 库。 客户端集成将 OpenAIClient 注册为服务集合中的单例服务。 客户端可用于与 OpenAIREST API 进行交互。

此外,已经可用的 .NET AspireAzureOpenAI 集成 得到了改进,为配置 OpenAIClient 提供了一种灵活的方法,无论是针对 Azure AI OpenAI 服务还是一个具有新 OpenAI 构建器方法的专用 RESTAddOpenAIClientFromConfiguration(IHostApplicationBuilder, String) API。 以下示例检测连接字符串是否用于 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 9 中添加的 .NET Aspire 改进内容。 有关所有中断性变更的完整列表,请参阅.NET.NET Aspire 9 中的中断性变更

Azure 资源自定义

在 .NET Aspire 8 中,自定义 Azure 资源被标记为实验性,因为基础 Azure.Provisioning 库是新的,收集反馈,然后才能将其标记为稳定。 在 .NET.NET Aspire 9 中,这些 API 已更新并删除实验属性。

Azure 资源命名不兼容变更

作为 Azure.Provisioning 库更新的一部分,Azure 资源的默认命名方案已更新,并更好地支持各种命名策略。 但是,此更新导致更改资源命名方式。 新的命名策略可能会导致现有 Azure 资源被放弃,并在将 Azure 应用程序从 8 更新到 9 后创建新的 .NET Aspire 资源。 若要继续使用 .NET.NET Aspire 8 中的相同命名策略,可以将以下代码添加到 AppHost Program.cs

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 ID

为了使 .NET Aspire 应用程序更安全,已将 Azure 数据库更新为默认使用 Microsoft Entra ID,该数据库用于 PostgreSQL 和 Azure Cache for Redis 资源。 这需要更改需要连接到这些资源的应用程序。 请参阅以下内容,了解如何更新应用程序以使用 Microsoft Entra ID 连接到这些资源:

以下示例演示如何将应用程序配置为使用 Microsoft Entra ID 连接到 Azure 资源:

如果需要使用密码或访问密钥身份验证(不建议),可以使用以下代码选择加入:

var builder = DistributedApplication.CreateBuilder(args);

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

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

对 Azure 函数的支持(预览版)

Azure Functions 的支持是 .NET.NET Aspire 问题跟踪器上请求最多的功能之一,我们很高兴在此版本中引入对它的预览支持。 为了演示此支持,让我们使用 .NET.NET Aspire 来创建和部署 Webhook。

若要开始,请使用Azure对话框创建新的Visual Studio Functions 项目。 出现提示时,请在创建项目时选中复选框中的 登记在 Aspire 业务流程

创建新的 .NET AspireAzure Functions 项目。

在应用主机项目中,观察到新的 PackageReference NuGet 包中存在一个 📦。

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

此包提供一个 AddAzureFunctionsProject<TProject>(IDistributedApplicationBuilder, String) API,可在应用主机中调用以在 Azure 主机中配置 .NET Aspire Functions 项目:

var builder = DistributedApplication.CreateBuilder(args);

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

builder.Build().Run();

在此示例中,Webhook 负责将输入字符串转换为 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 以启动 Functions 托管程序。 启动 .NET.NET Aspire 仪表板后,会看到以下内容:

使用 .NET Aspire 函数应用运行的 Azure 的屏幕截图。

.NET .NET Aspire 具有:

  • 配置了模拟 Azure 存储资源,供主机用于记帐。
  • 本地启动了 Function 主机,目标环境为已注册的 Functions 项目。
  • 为侦听,将函数项目 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 工作程序和工作程序 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 Functions 项目的公共终结点,以便可以将请求发送到 HTTP 触发器:

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

若要使用 azd CLI部署应用程序,需要先获取最新版本。 若要安装最新版本,如果版本已过期,则会看到警告。 按照说明更新到最新版本。

安装后,导航到包含应用主机项目的文件夹并运行 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 客户端测试已部署的 Functions 应用程序:

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

Azure 中对 .NET Aspire Functions 的支持仍处于预览阶段,并且目前仅支持包括以下在内的有限触发器集:

有关详细信息,请参阅官方 .NET AspireAzure 功能集成(预发布版)

自定义 Azure Container Apps

最受欢迎的功能之一是可以在不修改 Bicep 的情况下,自定义由应用主机创建的 Azure Container Apps。 这可以通过在 PublishAsAzureContainerApp<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure,ContainerApp>) 命名空间中使用 PublishAsAzureContainerApp<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure,ContainerApp>)Aspire.Hosting.Azure.AppContainers API 来实现。 这些方法自定义应用主机创建的 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 文件。

另请参阅