You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Aspire服务发现中获取注入URL并返回至/settings端点

在Aspire中让Angular前端的/settings端点返回服务发现的API URL

核心思路

你不需要依赖HttpClient的自动关联,直接通过Aspire提供的IServiceDiscoveryProvider动态查询后端API的服务地址,替换原ClientSettings中的硬编码URL,再通过/settings端点返回即可。

具体实现步骤

1. 给前端的.NET后端项目添加Aspire依赖

安装必要的NuGet包:

dotnet add package Aspire.Hosting
dotnet add package Aspire.Dashboard.Client

2. 配置Aspire服务发现

在前端项目的Program.cs中添加服务发现支持:

var builder = WebApplication.CreateBuilder(args);

// 启用Aspire服务发现
builder.AddServiceDiscovery();

// 保留原有的Angular静态文件服务配置
builder.Services.AddSpaStaticFiles(config =>
{
    config.RootPath = "ClientApp/dist";
});

// 注册自定义的Settings服务,用于动态获取API地址
builder.Services.AddScoped<ISettingsService, SettingsService>();

var app = builder.Build();

// 配置/settings端点,使用自定义服务返回动态配置
app.MapGet("/settings", async (ISettingsService settingsService) =>
{
    var dynamicSettings = await settingsService.GetClientSettingsAsync();
    return Results.Ok(dynamicSettings);
});

// 保留原有的Angular SPA中间件配置
app.UseSpa(spa =>
{
    spa.Options.SourcePath = "ClientApp";
    if (app.Environment.IsDevelopment())
    {
        spa.UseAngularCliServer(npmScript: "start");
    }
});

app.Run();

3. 实现动态获取服务地址的Settings服务

创建接口和实现类,通过IServiceDiscoveryProvider查询Aspire注册的服务地址:

// 定义接口
public interface ISettingsService
{
    Task<ClientSettings> GetClientSettingsAsync();
}

// 实现类
public class SettingsService : ISettingsService
{
    private readonly IServiceDiscoveryProvider _serviceDiscovery;
    private readonly ClientSettings _defaultSettings;

    // 注入服务发现提供者和默认配置(作为降级方案)
    public SettingsService(IServiceDiscoveryProvider serviceDiscovery, IOptions<ClientSettings> defaultSettings)
    {
        _serviceDiscovery = serviceDiscovery;
        _defaultSettings = defaultSettings.Value;
    }

    public async Task<ClientSettings> GetClientSettingsAsync()
    {
        var dynamicSettings = new ClientSettings
        {
            ApiUrls = new Dictionary<string, string>(_defaultSettings.ApiUrls)
        };

        // 遍历默认配置中的API服务名称,替换为Aspire发现的实际地址
        foreach (var apiName in dynamicSettings.ApiUrls.Keys.ToList())
        {
            try
            {
                var endpoints = await _serviceDiscovery.GetEndpointsAsync(apiName);
                if (endpoints.Any())
                {
                    // 取第一个可用的端点地址,可根据需求筛选HTTP/HTTPS
                    dynamicSettings.ApiUrls[apiName] = endpoints.First().Uri.ToString();
                }
            }
            catch (Exception)
            {
                // 服务发现失败时,保留默认配置
            }
        }

        return dynamicSettings;
    }
}

4. 在Aspire AppHost中注册服务

在你的Aspire宿主项目(通常是AppHost)中,注册API后端和前端服务,并建立依赖关系:

var builder = DistributedApplication.CreateBuilder(args);

// 注册API后端服务,服务名称要和ClientSettings中的键一致
var apiService = builder.AddProject<Projects.YourApiProject>("your-api");

// 注册前端服务,并关联API服务,Aspire会自动处理服务发现
var frontEndService = builder.AddProject<Projects.YourAngularFrontend>("your-frontend")
                            .WithReference(apiService);

builder.Build().Run();

关键注意事项

  • 服务名称匹配:确保ClientSettings中ApiUrls的键(比如"your-api")和Aspire AppHost中注册的服务名称完全一致,否则无法正确发现地址。
  • 降级方案:在服务发现失败时保留默认配置,避免前端因无法获取API地址而崩溃。
  • 环境适配:Aspire会自动处理开发/生产环境的服务地址,开发时用本地容器/进程地址,生产时用集群内的服务发现地址。

内容的提问来源于stack exchange,提问作者wertzui

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 05:07:28