C#下载XML遇无效状态行错误,疑HTTP 0.9版本不兼容
解决.NET因HTTP 0.9不兼容导致的XML下载错误
问题原因
没错,你的问题根源就是.NET的HTTP客户端(包括XDocument.Load和HttpClient)默认不支持HTTP 0.9协议。HTTP 0.9是非常老旧的极简协议,响应没有状态行、响应头,直接返回原始内容。而.NET的客户端会严格按照HTTP/1.0及以上的规范解析响应,把返回的XML第一行误识别为状态行,从而抛出"Received an invalid status line"错误。
解决方法
由于高级HTTP客户端不支持HTTP 0.9,需要直接使用TcpClient手动建立TCP连接,构造HTTP 0.9请求并读取响应内容。以下是完整实现:
手动下载HTTP 0.9内容的方法
using System; using System.IO; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; public static class Http09Client { public static async Task<string> DownloadContentAsync(string url) { var uri = new Uri(url); // 连接目标服务器的80端口(HTTP默认端口) using var tcpClient = new TcpClient(); await tcpClient.ConnectAsync(uri.Host, uri.Port == -1 ? 80 : uri.Port); // 构造HTTP 0.9请求:仅包含GET请求行,无额外头部 var request = $"GET {uri.PathAndQuery} HTTP/0.9\r\n\r\n"; var requestBytes = Encoding.ASCII.GetBytes(request); using var stream = tcpClient.GetStream(); // 发送请求 await stream.WriteAsync(requestBytes, 0, requestBytes.Length); // 读取响应:HTTP 0.9直接返回原始内容,这里指定目标编码Windows-1250 using var reader = new StreamReader(stream, Encoding.GetEncoding("Windows-1250")); return await reader.ReadToEndAsync(); } }
使用示例
public static async Task Run() { string url = "http://www.strava.cz/foxisapi/foxisapi.dll/istravne.istravne.process?xmljidelnickyA&zarizeni=0000"; string xmlContent = await Http09Client.DownloadContentAsync(url); // 将XML内容加载到XDocument var xmlDoc = XDocument.Parse(xmlContent); // 后续转换为DataTable的逻辑(根据XML结构自行实现) }
注意事项
- 该实现仅适用于HTTP协议,若目标是HTTPS需要额外用
SslStream包装TCP流 - 需要手动处理编码(目标返回的是Windows-1250编码,需对应指定)
- 没有内置重定向、错误处理逻辑,若需要可自行添加判断
- 仅针对HTTP 0.9的简单场景,不适用于复杂的HTTP交互
内容的提问来源于stack exchange,提问作者T0biasCZe
相关产品推荐
相关产品推荐

