.NET 6中多Web API同进程托管及独立Swagger实现方案问询
实现方案:将多个.NET 6 Web API合并到同一托管进程并保留独立端点与Swagger UI
1. 项目结构调整
- 将原有每个独立的Web API微服务改造为类库项目(Class Library),保留各自的控制器、业务逻辑、配置等核心代码。
- 移除类库中原有的
Program.cs,把服务注册、中间件配置逻辑封装成扩展方法(比如AddMyService1、UseMyService1Endpoints)。 - 新建一个ASP.NET Core Web API项目作为统一托管进程,负责整合所有微服务类库。
2. 配置服务路由前缀
为每个微服务绑定专属路由前缀,确保原有端点路径完全保留:
- 在每个微服务类库中定义端点扩展方法,用
MapGroup指定路由前缀:
// MyService1类库中的扩展方法 public static class MyService1Extensions { public static IServiceCollection AddMyService1(this IServiceCollection services) { // 注册MyService1依赖(如DbContext、业务服务) services.AddScoped<IMyService1Logic, MyService1Logic>(); services.AddControllers(); return services; } public static IEndpointRouteBuilder MapMyService1Endpoints(this IEndpointRouteBuilder app) { // 绑定路由前缀/myservice1 var serviceGroup = app.MapGroup("/myservice1"); serviceGroup.MapControllers(); return app; } }
- 在统一托管项目的
Program.cs中引入所有微服务的扩展方法:
var builder = WebApplication.CreateBuilder(args); // 注册所有微服务依赖 builder.Services.AddMyService1(); builder.Services.AddMyService2(); // ... 其他服务 var app = builder.Build(); // 全局中间件配置 app.UseHttpsRedirection(); app.UseAuthorization(); // 映射所有微服务端点 app.MapMyService1Endpoints(); app.MapMyService2Endpoints(); // ... 其他服务端点 app.Run();
3. 配置独立Swagger UI
为每个微服务生成单独的Swagger文档,并配置专属UI访问路径:
- 在统一托管项目中配置Swagger生成器,为每个服务创建独立文档:
builder.Services.AddSwaggerGen(options => { // 为MyService1创建Swagger文档 options.SwaggerDoc("myservice1", new OpenApiInfo { Title = "My Service 1 API", Version = "v1" }); // 为MyService2创建Swagger文档 options.SwaggerDoc("myservice2", new OpenApiInfo { Title = "My Service 2 API", Version = "v1" }); // 加载类库的XML注释(可选,需在类库项目中启用XML文档生成) var xmlFile1 = $"{typeof(MyService1Extensions).Assembly.GetName().Name}.xml"; var xmlPath1 = Path.Combine(AppContext.BaseDirectory, xmlFile1); options.IncludeXmlComments(xmlPath1); var xmlFile2 = $"{typeof(MyService2Extensions).Assembly.GetName().Name}.xml"; var xmlPath2 = Path.Combine(AppContext.BaseDirectory, xmlFile2); options.IncludeXmlComments(xmlPath2); });
- 配置Swagger UI,为每个服务指定独立访问路径:
if (app.Environment.IsDevelopment()) { app.UseSwagger(); // 为MyService1配置Swagger UI app.MapSwaggerUI(options1 => { options1.SwaggerEndpoint("/swagger/myservice1/swagger.json", "My Service 1 API v1"); options1.RoutePrefix = "myservice1/swagger"; }); // 为MyService2配置独立的Swagger UI app.MapSwaggerUI(options2 => { options2.SwaggerEndpoint("/swagger/myservice2/swagger.json", "My Service 2 API v1"); options2.RoutePrefix = "myservice2/swagger"; }); }
注:若生产环境需要启用Swagger,移除
IsDevelopment()判断即可。
4. 验证与部署
- 启动项目后,原有端点(如
https://example.com/myservice1/api/values)可正常响应。 - 访问各服务Swagger UI:
- MyService1:
https://example.com/myservice1/swagger/index.html - MyService2:
https://example.com/myservice2/swagger/index.html
- MyService1:
内容的提问来源于stack exchange,提问作者someName
相关产品推荐
相关产品推荐

