C# 使用Socket发送HTTP请求返回503 Service Unavailable问题排查
代码问题排查结果
核心错误点
- 目标服务IP解析错误
你的代码中使用Dns.GetHostEntry(Dns.GetHostName())获取的是本地主机的IP地址,后续连接的IPEndPoint指向的是本地的80端口,也就是你查到的System进程监听的本地80端口,请求根本没有发送到你想要访问的外部网站google.com。你需要解析目标外部网站的域名获取IP,而非解析本地主机名。 - 协议头配置冲突
你使用的是HTTP/1.0协议版本,该版本默认不支持长连接,和你设置的Connection: keep-alive头存在逻辑冲突,即便正确连接到外部服务也可能引发兼容问题。 - 响应接收循环逻辑错误
Socket.Receive方法在连接正常关闭时会返回0,你当前设置的循环条件bytes >= 0会在连接关闭后进入死循环,持续读取空内容。
修复参考代码
class Program { public static void Main(string[] args) { // 解析目标外部网站域名,而非本地主机名 IPHostEntry ipHostInfo = Dns.GetHostEntry("google.com"); IPAddress ipAddress = ipHostInfo.AddressList[0]; IPEndPoint RHost = new IPEndPoint(ipAddress, 80); Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Connect(RHost); // 修正协议和Connection头的冲突,也可以将Connection改为close适配HTTP/1.0 string HTTPRequestHeaders_String = "GET / HTTP/1.1\r\nHost: google.com\r\nConnection: close\r\nAccept: text/html\r\nUser-Agent: ConnectionTest\r\n\r\n"; Console.WriteLine(HTTPRequestHeaders_String); byte[] HTTPRequestHeaders = System.Text.Encoding.ASCII.GetBytes(HTTPRequestHeaders_String); socket.Send(HTTPRequestHeaders, SocketFlags.None); String Response = ""; byte[] buffer = new byte[(int)socket.ReceiveBufferSize]; int bytes; // 修正循环条件,返回0代表连接关闭,停止读取 do { bytes = socket.Receive(buffer); Response += Encoding.ASCII.GetString(buffer, 0, bytes); } while (bytes > 0); Console.WriteLine(Response); socket.Close(); } }
503错误说明
你之前收到的503响应是本地监听80端口的System进程返回的,该服务接收到Host为google.com的请求后无法匹配到对应的站点处理逻辑,因此返回服务不可用错误。
内容的提问来源于stack exchange,提问作者nothing_authentic
相关产品推荐
相关产品推荐

