如何用.NET TcpClient获取网页HTML?请求返回400错误
解决TcpClient发起GET请求返回400 Bad Request的问题
你的代码返回400错误主要有两个核心问题:
1. 缺少必填的Host请求头
HTTP/1.1协议要求所有请求必须包含Host头字段,服务器需要这个字段来确定要处理的目标主机(尤其是多域名共享IP的虚拟主机场景)。你的请求里没有添加这个头,这是导致400的主要原因之一。
2. 请求头存在多余缩进
你使用了逐字字符串(@前缀),每行开头的空格会被直接包含到请求内容里,导致HTTP头字段格式无效。比如Accept字段前面的空格会让服务器无法识别这个头。
修正后的代码
using var tcpClient = new TcpClient(); var hostname = "google.com"; tcpClient.Connect(hostname, 80); using NetworkStream networkStream = tcpClient.GetStream(); networkStream.ReadTimeout = 2000; // 正确构造HTTP请求:无多余缩进,包含Host头,用\r\n分隔字段 var message = $"GET / HTTP/1.1\r\n" + $"Host: {hostname}\r\n" + $"Accept: text/html, charset=utf-8\r\n" + $"Connection: close\r\n" + "\r\n"; Console.WriteLine(message); byte[] bytes = Encoding.UTF8.GetBytes(message); networkStream.Write(bytes, 0, bytes.Length); using var reader = new StreamReader(networkStream, Encoding.UTF8); Console.WriteLine(reader.ReadToEnd());
关键修正点说明
- 添加了
Host: {hostname}头字段,这是HTTP/1.1的强制要求 - 去掉了请求内容里的多余缩进,确保每个HTTP头字段都是
Key: Value的标准格式 - 明确用
\r\n分隔每个头字段和请求行,最后用两个\r\n标记请求结束
这样构造的请求就符合HTTP/1.1的规范,服务器会正常返回响应内容。
内容的提问来源于stack exchange,提问作者IOEnthusiast
相关产品推荐
相关产品推荐

