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

.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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 07:40:27