.NET MAUI 与 Aspire 的集成

重要

此功能目前处于预览状态。 某些功能仍在实施中,并且尚未完全提供与 Visual Studio 2026 的集成。

Aspire 是一个有意见的、云就绪的堆栈,用于生成可观察的、生产就绪的分布式应用程序。 .NET MAUI 与 Aspire 的集成简化了开发体验,在开发过程中生成连接到本地 Web 服务的移动和桌面应用程序。

什么是 Aspire?

Aspire 提供了一组一致的、有意见的工具和模式,用于生成和运行分布式应用程序。 它旨在通过提供以下功能来改进生成云原生应用程序的体验:

  • 编排:简化多个服务和依赖关系的管理
  • 组件:通用服务和平台的预构建集成
  • 工具:用于监视和管理服务的开发人员仪表板
  • 服务发现:服务到服务通信的自动配置

有关 Aspire 的详细信息,请参阅 Aspire 文档

将 Aspire 与 .NET MAUI 配合使用的好处

将 Aspire 与 .NET MAUI 应用程序集成可提供几个关键优势:

  • 简化的配置:消除复杂的特定于平台的网络配置。 无需手动处理 10.0.2.2 Android 或处理证书验证问题。
  • 自动服务发现:MAUI 应用会自动发现并连接到本地服务,而无需硬编码 URL。
  • 开发隧道集成:对 iOS 和 Android 上的开发隧道的内置支持,使移动模拟器和模拟器可以轻松连接到本地服务。
  • 一致的体验:在整个应用程序堆栈中使用相同的模式和工具。
  • 可观察的服务:在开发过程中通过 Aspire 仪表板监视服务。

与传统方法的比较

传统上,将 .NET MAUI 应用连接到本地 Web 服务需要大量的手动配置。 你需要:

  • 将不同的 URL 用于不同的平台(localhost、10.0.2.2 等)
  • 为 Android 配置网络安全设置
  • 为 iOS 设置 Apple Transport Security (ATS)
  • 处理 HTTPS 的证书验证
  • 在代码中手动管理服务网址

有关传统方法的详细信息,请参阅 “连接到本地 Web 服务”。

通过 Aspire 集成,这些复杂性会自动处理,使你能够专注于构建应用程序,而不是配置网络访问。

先决条件

若要将 Aspire 与 .NET MAUI 配合使用,需要:

  • .NET 10 SDK 或更高版本
  • Aspire 13 或更高版本
  • 面向 .NET 10 或更高版本的 .NET MAUI 应用
  • 一个或多个 Web 服务

入门指南

将 Aspire 与 .NET MAUI 应用程序集成涉及将两个关键项目添加到您的解决方案中:

  1. MAUI 服务默认值项目:为 MAUI 应用提供默认配置
  2. 应用主机项目:协调应用程序服务并处理服务发现

创建 MAUI 服务默认值项目

MAUI 服务默认值项目包含 MAUI 应用程序用于连接到服务的共享配置。 在解决方案目录中创建此项目:

dotnet new maui-aspire-servicedefaults -n YourApp.MauiServiceDefaults

将项目添加到解决方案:

dotnet sln add YourApp.MauiServiceDefaults/YourApp.MauiServiceDefaults.csproj

此项目包括:

  • 服务发现配置
  • 默认复原模式
  • 遥测设置
  • 特定于平台的网络配置

在 .NET MAUI 应用项目中添加对该项目的引用:

dotnet add YourMauiApp.csproj reference YourApp.MauiServiceDefaults/YourApp.MauiServiceDefaults.csproj

创建应用主机项目

应用主机项目协调所有应用程序服务,包括 MAUI 应用和任何后端服务。 在解决方案目录中创建此项目:

dotnet new aspire-apphost -n YourApp.AppHost

将项目添加到解决方案:

dotnet sln add YourApp.AppHost/YourApp.AppHost.csproj

将引用添加到您的 MAUI 应用程序和任何 Web 服务项目中:

dotnet add YourApp.AppHost.csproj reference YourMauiApp/YourMauiApp.csproj
dotnet add YourApp.AppHost.csproj reference YourWebService/YourWebService.csproj

添加对 .NET MAUI 的 Aspire 托管套餐的引用:

dotnet add package Aspire.Hosting.Maui --version 13.0.0-preview.1.25560.3 --project .\YourApp.AppHost\YourApp.AppHost.csproj

注释

现在,需要使用 Aspire.Hosting.Maui 包的预览版。

配置应用主机

在您的应用主机项目的 Program.cs 中,注册 MAUI 应用程序和 Web 服务:

var builder = DistributedApplication.CreateBuilder(args);

// Register your web service
var weatherApi = builder.AddProject("webapi", @"../YourWebService/YourWebService.csproj");

// Create a public dev tunnel for iOS and Android
var publicDevTunnel = builder.AddDevTunnel("devtunnel-public")
    .WithAnonymousAccess()
    .WithReference(weatherApi.GetEndpoint("https"));

// Register your MAUI app
var mauiapp = builder.AddMauiProject("mauiapp", @"../YourMauiApp/YourMauiApp.csproj");

// Add Windows device (uses localhost directly)
mauiapp.AddWindowsDevice()
    .WithReference(weatherApi);

// Add Mac Catalyst device (uses localhost directly)
mauiapp.AddMacCatalystDevice()
    .WithReference(weatherApi);

// Add iOS simulator with Dev Tunnel
mauiapp.AddiOSSimulator()
    .WithOtlpDevTunnel() // Required for OpenTelemetry data collection
    .WithReference(weatherApi, publicDevTunnel);

// Add Android emulator with Dev Tunnel
mauiapp.AddAndroidEmulator()
    .WithOtlpDevTunnel() // Required for OpenTelemetry data collection
    .WithReference(weatherApi, publicDevTunnel);

builder.Build().Run();

注释

可以为同一 MAUI 项目添加多个 Windows、Mac Catalyst、iOS 或 Android 仿真器或设备。 每个设备配置都可以面向不同的平台,允许你从同一应用主机同时在多个目标上部署和测试应用。 例如,可以添加 iOS 模拟器和物理 iOS 设备,或具有不同配置的多个 Android 仿真器。

Visual Studio 2026 解决方案资源管理器的屏幕截图,其中显示了 Aspire 业务流程中典型的 .NET MAUI 项目设置。

配置 MAUI 应用

在 .NET MAUI 应用中 MauiProgram.cs,配置服务默认值并添加 HTTP 客户端:

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();

        builder
            .UseMauiApp<App>()
            .ConfigureFonts(fonts =>
            {
                fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
            });

        // Add service defaults
        builder.AddServiceDefaults();

        // Configure HTTP client with service discovery
        builder.Services.AddHttpClient<WeatherApiClient>(client =>
        {
            // Service name matches the name used in App Host
            client.BaseAddress = new Uri("https+http://webapi");
        });

        return builder.Build();
    }
}

方案 https+http:// 是启用 HTTPS 和 HTTP 协议的特殊语法,优先使用 HTTPS。 服务名称(webapi 在此示例中)必须与在应用主机 Program.cs中注册服务时使用的名称匹配。

创建服务客户端

创建类型化客户端以使用 Web 服务:

public class WeatherApiClient
{
    private readonly HttpClient _httpClient;

    public WeatherApiClient(HttpClient httpClient)
    {
        _httpClient = httpClient;
    }

    public async Task<WeatherForecast[]?> GetWeatherForecastAsync(CancellationToken cancellationToken = default)
    {
        return await _httpClient.GetFromJsonAsync<WeatherForecast[]>(
            "/weatherforecast",
            cancellationToken);
    }
}

public record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary)
{
    public int TemperatureF => 32 + (int)(TemperatureC * 1.8);
}

在应用中使用客户端

在页面或视图模型中注入并使用客户端:

public partial class MainPage : ContentPage
{
    private readonly WeatherApiClient _weatherClient;

    public MainPage(WeatherApiClient weatherClient)
    {
        _weatherClient = weatherClient;
        InitializeComponent();
    }

    private async void OnGetWeatherClicked(object sender, EventArgs e)
    {
        try
        {
            var forecasts = await _weatherClient.GetWeatherForecastAsync();

            if (forecasts != null)
            {
                // Display the weather data
                ResultLabel.Text = $"Retrieved {forecasts.Length} forecasts";
            }
        }
        catch (Exception ex)
        {
            ResultLabel.Text = $"Error: {ex.Message}";
        }
    }
}

特定于平台的注意事项

iOS 和 Mac Catalyst

在 iOS 和 Mac Catalyst 上,Aspire 集成在通过应用主机运行应用时无缝工作。 服务发现配置自动提供正确的 URL 以连接到本地服务。

使用 iOS 模拟器或在物理设备上运行时,开发隧道会自动配置为启用与开发计算机上运行的服务的连接。

Android

在 Android 上,Aspire 集成会自动处理特定于平台的网络要求。 不再需要:

  • 配置特殊 10.0.2.2 地址
  • 设置网络安全配置文件
  • 启用用于本地开发的明文流量

集成使用 Dev Tunnels 在 Android 模拟器和本地服务之间提供安全可靠的连接。

浏览器中运行的 Aspire 仪表板列出了所有资源。在前台,有一个在 Windows 和 Android 模拟器上运行的 .NET MAUI 应用。

Dev Tunnels 集成

开发隧道提供了一种安全的方法,用于向移动设备和模拟器公开本地 Web 服务。 Aspire 集成自动:

  • 为您的服务创建和管理开发隧道 (Dev Tunnels)
  • 将 MAUI 应用配置为使用隧道 URL
  • 处理身份验证和连接管理

这样就无需复杂的网络配置,并可以轻松地在物理设备上测试应用。

OpenTelemetry 数据收集

在应用主机中配置 iOS 和 Android 设备时,请使用 WithOtlpDevTunnel() 此方法从以下平台启用 OpenTelemetry 数据收集:

mauiapp.AddiOSSimulator()
    .WithOtlpDevTunnel() // Required for OpenTelemetry data collection
    .WithReference(weatherApi, publicDevTunnel);

mauiapp.AddAndroidEmulator()
    .WithOtlpDevTunnel() // Required for OpenTelemetry data collection
    .WithReference(weatherApi, publicDevTunnel);

该方法 WithOtlpDevTunnel() 专门为 OpenTelemetry 协议(OTLP)流量创建开发隧道,允许 iOS 和 Android 应用中的遥测数据访问开发计算机上的 Aspire 仪表板。 这对于通过 Aspire 仪表板监视和调试移动应用至关重要。

有关开发隧道的详细信息,请参阅 开发隧道文档

Windows操作系统

在 Windows 上,本地服务连接直接通过 localhost 工作,而无需其他配置。 Aspire 集成在所有平台上提供一致的 API,但 Windows 上的基础实现非常简单。

运行应用程序

若要使用 Aspire 集成运行 MAUI 应用,可以使用以下方法之一:

Visual Studio:

  1. 将应用主机项目设置为启动项目
  2. 运行解决方案(F5 或调试 > 开始调试)

命令行:

  1. 导航到应用主机项目目录
  2. 运行dotnet run 或者 dotnet run --project YourApp.AppHost.csproj,或者您也可以使用 Aspire CLI 并运行aspire run

VS Code:

  1. 打开“应用主机”项目文件夹
  2. 使用 .NET 调试器或终端运行项目

应用主机启动时:

  • Aspire 仪表板将打开,显示所有已注册的服务
  • MAUI 应用 不会 自动启动。 可以通过仪表板手动启动每个 .NET MAUI 目标。

Aspire 仪表板展示用于 Blazor 混合应用、混合 WebView 应用和常规 .NET MAUI 应用的不同 .NET MAUI 资源,以及 Dev Tunnels 和一个后台支持的 ASP.NET Web API。

通过应用主机运行应用程序时:

  • 所有服务自动启动
  • 服务发现已完成配置
  • 仪表板提供实时监视
  • 所有服务的日志可在一个位置使用

监视和调试

Aspire 仪表板提供强大的工具来监视和调试应用程序:

  • 资源视图:查看所有正在运行的服务及其状态
  • 日志:在一个位置查看所有服务的组合日志
  • 跟踪:跨服务分布式跟踪
  • 指标:监视性能和资源使用情况

Aspire 仪表板显示从 .NET MAUI 应用到 Web API 的 HTTP 请求的跟踪信息。

Troubleshooting

本部分介绍将 Aspire 与 .NET MAUI 应用程序集成时可能会遇到的常见问题。

iOS/Android 应用中缺少指标或跟踪

如果在 Aspire 控制台中看不到 iOS 或 Android 应用的遥测数据(指标、跟踪或日志),请确认是否已将 WithOtlpDevTunnel() 方法添加到 App Host 的设备配置中:

mauiapp.AddiOSSimulator()
    .WithOtlpDevTunnel() // Required for OpenTelemetry data collection
    .WithReference(weatherApi, publicDevTunnel);

mauiapp.AddAndroidEmulator()
    .WithOtlpDevTunnel() // Required for OpenTelemetry data collection
    .WithReference(weatherApi, publicDevTunnel);

该方法 WithOtlpDevTunnel() 专门创建一个用于 OpenTelemetry 协议(OTLP)流量的开发隧道,以便移动设备的遥测数据可以传输到您的开发计算机。 如果没有此功能,iOS 和 Android 应用将无法将其遥测数据发送到 Aspire 仪表板。

服务发现不起作用

如果 MAUI 应用无法连接到 Web 服务:

  1. 验证是否已在 MAUI 应用中调用AddServiceDefaults()MauiProgram.cs
  2. 确保 HTTP 客户端配置中的服务名称与应用主机中使用的名称匹配
  3. 请检查你在你的服务 URL 中使用的架构。
  4. 对于 iOS 和 Android,请确认已在应用主机中正确配置了开发隧道

开发隧道(Dev Tunnels)连接问题

如果 Dev Tunnels 无法在 iOS 或 Android 上运行:

  1. 确保开发隧道配置了匿名访问: .WithAnonymousAccess()
  2. 验证设备配置是否包含 Dev Tunnel 引用: .WithReference(weatherApi, publicDevTunnel)
  3. 检查防火墙或网络安全设置是否未阻止隧道连接
  4. 尝试重启应用主机以重新创建隧道

应用主机不会启动

如果应用主机无法启动:

  1. 确保应用主机 Program.cs 中的所有项目路径都正确,并使用相对路径
  2. 验证所有引用的项目是否都自行成功生成
  3. 检查是否已正确安装 .NET 10 SDK 和 Aspire
  4. 查看应用主机控制台输出以获取特定错误消息

MAUI 应用找不到服务默认值

如果 MAUI 应用报告有关缺少服务默认值的错误:

  1. 验证是否已在 MAUI 应用的项目文件中添加了对 MAUI 服务默认值项目的引用
  2. 确保服务默认值项目生成成功
  3. 在配置 HTTP 客户端之前,请检查你是否正在调用AddServiceDefaults()

最佳做法

使用 Aspire 集成生成 .NET MAUI 应用时:

  • 使用类型化客户端:为每个服务创建强类型 HTTP 客户端以提高可维护性
  • 优雅地处理错误:网络操作可能失败,需实现正确的错误处理和重试逻辑
  • 利用仪表盘:在开发过程中使用 Aspire 仪表盘进行调试和监控
  • 在所有平台上进行测试:虽然集成处理平台差异,但始终在目标平台上进行测试
  • 遵循服务默认值:服务默认值项目为复原和遥测提供建议的模式

示例应用程序

有关 .NET MAUI 与 Aspire 集成的完整工作示例,请参阅 Aspire 存储库中的 AspireWithMaui 示例

此示例演示:

  • 完成项目结构
  • 服务注册和发现
  • 特定于平台的注意事项
  • 错误处理和复原模式

其他资源

.NET MAUI 与 Aspire 的集成在 .NET MAUI 10 及更高版本中提供。 有关在早期版本中连接到本地 Web 服务的信息,请参阅 “连接到本地 Web 服务”。