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

.NET 6.0集成测试CreateClient()挂起无法创建HttpClient问题

问题根因

测试挂起卡在factory.CreateClient()的核心原因是你在自定义的ConfigureWebHost方法中手动设置了ASPNETCORE_URLS环境变量,强制测试宿主绑定1229端口启动真实Kestrel网络监听。
WebApplicationFactory的默认运行逻辑是启动内存级别的TestServer来承载测试服务,不需要占用真实端口、也不会启动常驻的网络监听进程,配套的CreateClient()方法默认会生成直接和内存TestServer通信的HttpClient实例。当你手动指定监听地址后,测试框架会切换到真实Kestrel服务器启动流程,宿主启动后会进入常驻等待请求的运行状态,无法完成TestServer的初始化流程,直接导致CreateClient()一直等待服务就绪、永久阻塞。
你看到控制台输出Now listening on : https://[::]:1229、Application started. Press Ctrl+C to shut down就是真实Kestrel宿主启动成功的典型日志,和生产环境启动Web服务的表现完全一致,这和集成测试默认的内存托管逻辑是冲突的。

修复方案
  • 直接删除ConfigureWebHost方法中设置ASPNETCORE_URLS的代码行,不要手动干预测试宿主的地址配置。集成测试框架会自动完成内存TestServer的配置,生成的HttpClient直接走内存通信,不会产生真实网络开销,也不会出现端口占用问题。
  • 保留你需要的业务相关环境变量配置即可,其他宿主配置交给测试框架自动处理。

修改后的正确CustomWebApplicationFactory实现如下:

public class CustomWebApplicationFactory<TStartup>
        : WebApplicationFactory<TStartup> where TStartup : class
{
    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        Environment.SetEnvironmentVariable("HANGFIRE_DASHBOARD_USERNAME", "test");
        Environment.SetEnvironmentVariable("HANGFIRE_DASHBOARD_PASSWORD", "test");
        // 移除 ASPNETCORE_URLS 的配置逻辑

        base.ConfigureWebHost(builder);
    }
}

修改完成后重新运行测试,控制台不会再出现真实Kestrel启动的监听日志,CreateClient()会正常返回实例,测试流程可以顺利执行到接口请求、断言阶段,不会再挂起。

注意:除非你有特殊的跨进程测试需求,否则不要在集成测试的WebApplicationFactory中配置固定监听地址启动真实Kestrel,这种模式既会拖慢测试执行速度,也容易出现端口占用、进程残留的问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 00:06:34