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

C#集成测试本地通过但Azure DevOps报400 Invalid Hostname错误

问题根因

手动通过_client.DefaultRequestHeaders.TryAddWithoutValidation("Host", "localhost")设置Host头不生效,是WebApplicationFactory内置TestServer的机制导致的:这类测试客户端发送请求时,会自动覆盖手动设置的Host头,优先使用客户端基地址对应的主机标识。
本地运行时,测试环境默认信任环回地址关联的主机名,所以校验能通过;Azure DevOps流水线的托管运行器环境中,TestServer自动生成的主机标识不在应用的允许主机列表中,就会直接返回400 Bad Request - Invalid Hostname错误。

修复方案

二选一即可,推荐优先用第一种,改动最小:

  • 方案1:创建客户端时直接指定localhost为基地址
    替换原有创建HttpClient的代码,不要事后手动加Host请求头:
    var query = "api/objectives?Year=2022&menteeId=eb32dd9d-ee98-400d-8567-811728840487";
    _factory = new CustomWebApplicationFactory<Program>(provider, AppendLogEntry);
    _client.DefaultRequestHeaders.Clear();
    // 创建客户端时直接指定基地址,TestServer会自动正确设置Host头,不会被覆盖
    _client = _factory.CreateClient(new WebApplicationFactoryClientOptions
    {
        BaseAddress = new Uri("http://localhost/")
    });
    
    //Act
    var response = await _client.GetAsync(query);
    var content = await response.Content.ReadAsStringAsync();
    // Assert
    response.StatusCode.ShouldBe(HttpStatusCode.OK, content);
    
  • 方案2:关闭测试环境的主机名校验
    如果不想每个创建客户端的地方都改基地址,可以直接在自定义的CustomWebApplicationFactory中配置测试宿主,允许所有Host访问,仅测试环境可用:
    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        // 允许所有主机名访问测试服务端
        builder.UseSetting("AllowedHosts", "*");
        // 原有其他测试配置逻辑保持不变
    }
    
    注意:AllowedHosts="*"的配置仅可用于集成测试场景,禁止配置到生产环境。
补充说明

之前手动设置Host头无效的核心原因是,TestServer在内部处理请求时,会跳过用户手动设置的Host头,直接从客户端配置的基地址解析Host值,事后加请求头的写法从机制上就不会生效。

内容的提问来源于stack exchange,提问作者Mădălina Vârgă

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 21:45:33