C#调用SOAP API报错:收到无效的Cache-Control请求头行
问题分析与解决方案
问题根源
错误信息明确指向请求头格式非法:Received an invalid header line: 'Cache-Control Value: no-store, no-cache, must-revalidate, max-age=0'。正常HTTP请求头的格式是Header-Name: Value,但这里错误地将头名称写成了Cache-Control Value,完全违反HTTP规范。
结合你的代码,存在两个核心问题:
- 代码重复:你复制了两遍完整的请求创建逻辑,这会导致重复设置请求头甚至触发重复请求,直接引发异常风险。
- Cache-Control头的设置存在隐性错误:虽然你用强类型方式设置,但重复代码可能导致头被错误拼接,或是之前的测试代码残留了
Cache-Control Value这种非法头名称的设置。
修复步骤
1. 删除重复代码
先清理掉重复的请求创建代码,保留一份完整逻辑即可:
var httpClient = new System.Net.Http.HttpClient(); var request = new HttpRequestMessage() { RequestUri = new Uri("https://somewhere/mySOAPAPI"), Method = HttpMethod.Post }; request.Content = new StringContent(soaprequest, Encoding.UTF8, "text/xml"); request.Headers.Clear(); request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("text/xml")); request.Content.Headers.ContentType = new MediaTypeHeaderValue("text/xml"); request.Headers.Add("SOAPAction", "http://tempuri.org/IExternalSolutionExecution/ExecuteXMLString"); // 正确设置Cache-Control头 request.Headers.CacheControl = new CacheControlHeaderValue { NoStore = true, NoCache = true, MaxAge = TimeSpan.Zero, MustRevalidate = true }; HttpResponseMessage response = await httpClient.SendAsync(request); Console.WriteLine(response);
2. 规范设置Cache-Control头
使用CacheControlHeaderValue的强类型属性设置,避免手动拼接头内容出错:
request.Headers.CacheControl = new CacheControlHeaderValue { NoStore = true, // 对应头参数 no-store NoCache = true, // 对应头参数 no-cache MaxAge = TimeSpan.Zero, // 对应头参数 max-age=0 MustRevalidate = true // 对应头参数 must-revalidate };
这种方式会自动生成符合规范的Cache-Control: no-store, no-cache, must-revalidate, max-age=0头,彻底避免头名称错误。
3. 优化请求头设置(可选)
将Accept头添加到当前请求的头集合中,而非HttpClient的默认头,避免影响后续其他请求:
// 替换原有的 httpClient.DefaultRequestHeaders.Accept.Add(...) request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("text/xml"));
验证
修复后,发送请求时会生成完全合法的HTTP头,不会再出现invalid header line的错误。如果问题仍存在,建议抓包查看实际发送的请求头,确认是否还有其他非法头残留。
内容的提问来源于stack exchange,提问作者yjl
相关产品推荐
相关产品推荐

