本地可正常访问的JSON接口在Azure环境调用返回406如何排查修复
HTTP 406 Not Acceptable 错误的核心是服务端无法生成符合请求Accept头指定格式的响应内容,本地和Azure环境的请求差异是故障根因,下面是具体排查解决步骤:
如何获取更多报错信息
- 先捕获完整的响应上下文,不要直接调用
EnsureSuccessStatusCode抛出异常,修改代码输出关键调试信息到Azure应用日志:
var client = new HttpClient(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); var response = await client.GetAsync(endpointurl); // 输出以下三个字段到Azure日志流/应用程序洞察排查 var statusCode = response.StatusCode; var allResponseHeaders = response.Headers.Concat(response.Content.Headers).ToString(); var responseBody = await response.Content.ReadAsStringAsync(); // 同时打印本次请求实际发送的所有请求头,和本地运行结果对比 var requestHeaders = client.DefaultRequestHeaders.ToString(); response.EnsureSuccessStatusCode();
- 到Azure对应服务的日志流页面查看上述输出的信息,也可以临时在Azure实例中通过curl命令直接调用接口复现问题:
curl -v -H "Accept: application/json" 你的接口地址,查看完整的请求响应交互流程。
排查&修复方案
- 请求头不一致问题:Azure环境下HttpClient可能会自动附加额外的代理头、X-Forwarded头,或是默认的User-Agent和本地环境不同,部分严格的接口会对非预期User-Agent的请求返回406。可以手动指定和本地浏览器一致的User-Agent:
client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36");
也可以简化Accept头的添加逻辑,避免自动附加的q优先级参数被接口拦截:
// 替换原MediaTypeWithQualityHeaderValue写法 client.DefaultRequestHeaders.Add("Accept", "application/json");
- IP/区域限制问题:部分服务会对白名单外的IP返回伪装的406错误,你可以在Azure服务的「属性」页面查询所有出站IP,确认这些IP是否在目标接口的访问白名单内。
- 中间件篡改问题:如果你在Azure侧配置了WAF、API管理、正向代理等网络中间件,需要确认这些中间件是否修改了请求的Accept头,可临时关闭中间件验证问题是否消失。
内容的提问来源于stack exchange,提问作者Xav Sc
相关产品推荐
相关产品推荐

