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

使用ApplicationFactory进行集成测试时出现Accept头无效问题

解决WebApplicationFactory集成测试中Accept头引发的406错误

问题根源

WebApplicationFactory生成的HttpClient自带默认请求头配置,有时候会覆盖手动添加的Accept头,或者默认的Accept头和API要求的不匹配,导致返回406错误。

可行解决方案

1. 清空默认Accept头后再添加指定值

创建HttpClient后,先清除默认的Accept头(默认一般是application/json),再添加API要求的特定值,避免头信息冲突:

using var factory = new WebApplicationFactory<Program>();
var client = factory.CreateClient();

// 清空默认Accept头
client.DefaultRequestHeaders.Accept.Clear();
// 替换成API要求的Accept头内容
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("your-target-media-type"));

var response = await client.GetAsync("/api/your-endpoint");
response.EnsureSuccessStatusCode();

2. 自定义WebApplicationFactory统一配置客户端

如果多个测试用例都需要设置这个头,可以自定义工厂类,在ConfigureClient里统一配置,避免重复代码:

public class TestAppFactory : WebApplicationFactory<Program>
{
    protected override void ConfigureClient(HttpClient client)
    {
        base.ConfigureClient(client);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("your-target-media-type"));
    }
}

// 测试中使用自定义工厂
using var factory = new TestAppFactory();
var client = factory.CreateClient();
var response = await client.GetAsync("/api/your-endpoint");

3. 适配API端严格的头验证逻辑

有些API的Accept头验证要求精确匹配(不允许带质量因子q=xxx),这时可以用ParseAdd直接添加纯文本格式的头:

client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.ParseAdd("your-target-media-type");

4. 排查实际发送的请求头

如果问题依旧,可以添加日志Handler捕获实际发送的请求头,确认是否和控制台请求的一致:

public class RequestLoggingHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        Console.WriteLine($"实际发送的Accept头: {request.Headers.Accept}");
        return await base.SendAsync(request, cancellationToken);
    }
}

// 给HttpClient挂载日志Handler
using var factory = new WebApplicationFactory<Program>();
var client = factory.CreateClient();
client.MessageHandler = new RequestLoggingHandler { InnerHandler = client.MessageHandler };

重点提醒

一定要先执行Accept.Clear(),否则默认的Accept头会和手动添加的头并存,很多API会因此返回406。另外要保证添加的头值和控制台请求里的完全一致,大小写、参数细节都不能出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 10:05:12