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

求.NET 8下兼容WebApplicationFactory与OpenApi的ASP.NET Core传统显式Program.cs模板

求.NET 8下兼容WebApplicationFactory与OpenApi的ASP.NET Core传统显式Program.cs模板

太懂你这种讨厌“编译器黑魔法”的心情了——那种隐式的Program.cs总让人觉得不踏实,还是传统的显式类和入口方法来得明明白白。下面给你一个.NET 8下的完整模板,不仅保留了经典的显式结构,还完美兼容WebApplicationFactory测试和OpenApi:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.OpenApi.Models;

public class Program
{
    // 显式的程序入口,和传统.NET程序完全一致
    public static async Task Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();
        await host.RunAsync();
    }

    // WebApplicationFactory自动查找的核心方法,必须严格匹配签名
    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.ConfigureServices(services =>
                {
                    // 添加API控制器支持(MVC项目可替换为AddControllersWithViews)
                    services.AddControllers();

                    // 配置OpenApi/Swagger服务
                    services.AddEndpointsApiExplorer();
                    services.AddSwaggerGen(c =>
                    {
                        c.SwaggerDoc("v1", new OpenApiInfo { Title = "你的API名称", Version = "v1" });
                    });
                })
                .Configure(app =>
                {
                    var env = app.ApplicationServices.GetRequiredService<IWebHostEnvironment>();

                    // 开发环境启用Swagger UI
                    if (env.IsDevelopment())
                    {
                        app.UseSwagger();
                        app.UseSwaggerUI(c =>
                        {
                            c.SwaggerEndpoint("/swagger/v1/swagger.json", "你的API V1");
                        });
                    }

                    app.UseHttpsRedirection();
                    app.UseRouting();
                    app.UseAuthorization();

                    // 映射控制器路由(Razor Pages项目可替换为MapRazorPages)
                    app.MapControllers();
                });
            });
}

关键细节拆解

  • 显式Main入口:完全抛弃隐式逻辑,手动创建并运行Host,所有流程都在你的掌控中,没有编译器生成的隐藏代码。
  • CreateHostBuilder方法:严格遵循WebApplicationFactory要求的public static IHostBuilder CreateHostBuilder(string[] args)签名——测试框架会自动扫描这个方法来构建测试环境的Host,不需要额外配置就能实现集成测试。
  • Host与WebHost配置:Host.CreateDefaultBuilder(args)会帮你初始化默认的Host配置(比如读取appsettings.json、环境变量、命令行参数等),和minimal API的默认行为完全一致;ConfigureWebHostDefaults则是连接传统Host和ASP.NET Core Web配置的桥梁,让你能像写minimal API一样配置服务和中间件。
  • OpenApi兼容:完整集成了Microsoft.AspNetCore.OpenApi包的所有必要配置,包括注册Swagger生成服务、定义API文档信息,以及开发环境下启用Swagger UI,和.NET 8的生态完美适配。
  • 灵活适配项目类型:如果是MVC项目,把AddControllers换成AddControllersWithViews、MapControllers换成传统MVC路由配置即可;如果是Razor Pages项目,替换为AddRazorPages和MapRazorPages就行。

测试兼容示例

在你的集成测试类中,只需要指定Program作为入口点,WebApplicationFactory会自动调用我们的CreateHostBuilder方法:

public class YourApiIntegrationTests : IClassFixture<WebApplicationFactory<Program>>
{
    private readonly WebApplicationFactory<Program> _factory;

    public YourApiIntegrationTests(WebApplicationFactory<Program> factory)
    {
        _factory = factory;
    }

    // 这里写你的测试方法,比如:
    [Fact]
    public async Task Get_EndpointsReturnSuccessAndCorrectContentType()
    {
        var client = _factory.CreateClient();
        var response = await client.GetAsync("/api/your-endpoint");
        
        response.EnsureSuccessStatusCode();
        Assert.Equal("application/json; charset=utf-8", 
            response.Content.Headers.ContentType.ToString());
    }
}

这个模板是通用型的,不管你做纯API还是带视图的Web项目,都能直接用或者按需微调,完全满足你“显式可控、兼容测试、支持OpenApi”的需求。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 11:44:50