You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 21:22:12