使用HttpClient发起请求时遭遇无效状态行错误
使用HttpClient发起请求时遭遇无效状态行错误
看起来你碰到的这个错误,完全是因为目标服务器返回的HTTP响应状态行不符合标准规范导致的——正常的HTTP/2 200状态行末尾根本不该多那个句号,而HttpClient的解析逻辑对这种不规范的内容容错性很低,直接就触发了HttpRequestException。
先把你的问题场景理清楚:
你用这段代码发起请求:
using HttpClient client = new HttpClient(); try { HttpResponseMessage response = await client.GetAsync("http://131.189.89.86:11920/SetupWizard.aspx/yNMgLvRtUj"); } catch (HttpRequestException e) { Console.WriteLine($"Request error: {e.Message}"); }
运行后得到的错误提示是:System.Net.Http.HttpRequestException: 'Received an invalid status line: 'HTTP/2 200 '.'
你提到尝试降级HTTP版本,这其实是个非常靠谱的思路!因为HTTP/2对帧格式和状态行的规范要求更严格,切换到HTTP/1.1的话,解析逻辑的容错性会高很多。这里给你一个具体的代码修改方案,强制HttpClient使用HTTP/1.1:
// 先创建自定义的Handler,指定禁用HTTP/2,强制用HTTP/1.1 var handler = new SocketsHttpHandler { UseHttp2 = false }; using HttpClient client = new HttpClient(handler); try { HttpResponseMessage response = await client.GetAsync("http://131.189.89.86:11920/SetupWizard.aspx/yNMgLvRtUj"); // 如果需要验证响应状态,还可以加上这行 // response.EnsureSuccessStatusCode(); // 后续按需处理你的响应内容即可 } catch (HttpRequestException e) { Console.WriteLine($"Request error: {e.Message}"); }
要是降级HTTP版本后还是不行,那可能就得自定义消息处理程序,在HttpClient解析响应之前手动修正那个多余的句号,但这个方案相对复杂,优先推荐上面的降级方式,简单直接就能解决大部分这类服务器不规范响应的问题。
备注:内容来源于stack exchange,提问作者Inside Man
相关产品推荐
相关产品推荐

