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
相关产品推荐
相关产品推荐

