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

ABP框架中如何将指定App Service独立部署到不同端口

实现步骤

1. 新建独立Host承载B App Service

通过ABP CLI创建一个仅包含后端的Host项目,专门部署B服务,比如命名为YourProjectName.B.HttpApi.Host,指定新端口(例如44343):

abp new YourProjectName.B.HttpApi.Host --template app --no-ui --database-provider ef-core --connection-string "你的原数据库连接字符串"

把原项目中所有和B相关的App Service、DTO、模块代码迁移到这个新Host里,确保新Host只引用包含B的应用层模块,完全剔除A相关依赖。

2. 配置共享认证体系

要和原Host(44342)共用一套认证,确保新Host能识别原Host颁发的Token:

  • 在新Host的appsettings.json中,配置JWT验证的Authority为原Host地址,Audience和原项目保持一致:
    "AuthServer": {
      "Authority": "https://localhost:44342",
      "Audience": "YourProjectName"
    }
    
  • 原Host的IdentityServer需要添加新Host的客户端授权,在原Host的IdentityServerDataSeedContributor类中添加客户端配置:
    var bHostClient = new Client
    {
      ClientId = "YourProjectName.B.HttpApi.Host",
      ClientSecrets = { new Secret("your-secret".Sha256()) },
      AllowedGrantTypes = GrantTypes.ClientCredentials,
      AllowedScopes = { "YourProjectName" }
    };
    await _identityServerDataSeeder.CreateClientAsync(bHostClient);
    
  • 新Host的Program.cs沿用原Host的认证中间件配置,保证JWT验证逻辑一致。

3. 共享数据库与基础设施服务

要复用原数据库和日志、审计等功能,只需:

  • 新Host的appsettings.json直接使用原项目的数据库连接字符串。
  • 引用原项目的基础设施模块(如YourProjectName.EntityFrameworkCore),日志、审计等数据会自动写入原数据库对应表。
  • 日志配置(如Serilog)和原Host保持一致,确保日志统一存储。

4. 阻止Angular访问B服务

  • 原Host(44342)不再包含B的App Service,Angular请求B接口会直接返回404。
  • 新Host配置严格的CORS策略,只允许指定内部服务访问,拒绝Angular的4200端口:
    // 新Host Program.cs
    builder.Services.AddCors(options =>
    {
        options.AddPolicy("InternalServicesOnly", policy =>
        {
            policy.WithOrigins("允许的内部服务地址列表")
                  .AllowAnyHeader()
                  .AllowAnyMethod();
        });
    });
    app.UseCors("InternalServicesOnly");
    

5. 用HttpApi.Client调用B服务(如果需要)

如果原Host或其他内部服务需要调用B的接口,用ABP的HttpApi.Client实现:

  • 先为新Host生成Client代理:
    abp generate-proxy -t csharp -u https://localhost:44343 -o YourProjectName.B.HttpApi.Client
    
  • 在需要调用B服务的项目(如原Host)中,引用生成的YourProjectName.B.HttpApi.Client包,然后在Program.cs中配置:
    builder.Services.AddHttpClientProxies(
        typeof(YourProjectName.B.HttpApi.ClientModule).Assembly,
        options => options.BaseAddress = new Uri("https://localhost:44343")
    );
    
  • 之后在代码中直接注入IBAppService,就能自动调用新Host的B接口,无需手动处理HTTP请求和认证。

6. 验证

  • 启动原Host和新Host,测试Angular访问A接口正常,访问B接口返回404。
  • 测试内部服务通过HttpApi.Client调用B接口,能正常获取数据,日志和审计记录写入原数据库。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 02:35:32