Ars*_*ray 4 c# tcp http httpwebrequest tcpclient
我正在尝试通过TCP流向页面发送GET请求.
这是我的代码的样子:
public class SocketLevelWebClient
{
public string SendWebRequest(string url, string request)
{
using(TcpClient tc = new TcpClient())
{
tc.Connect(url, 80);
using (NetworkStream ns = tc.GetStream())
{
using (System.IO.StreamWriter sw = new System.IO.StreamWriter(ns))
{
using (System.IO.StreamReader sr = new System.IO.StreamReader(ns))
{
sw.Write(request);
sw.Flush();
return sr.ReadToEnd();
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
请求本身:
SocketLevelWebClient wc = new SocketLevelWebClient();
var r=wc.SendWebRequest("www.youtube.com",@"GET http://www.youtube.com/ HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*
Accept-Language: en-US
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Host: www.youtube.com"+"\r\n\r\n");
Run Code Online (Sandbox Code Playgroud)
当我调用此代码时,它总是冻结等待来自服务器的响应.
我究竟做错了什么?
问题是ReadToEnd只在流结束时返回.不幸的是,服务器使TCP连接保持活动状态.因此ReadToEnd永远无法检测到真正的结束已经到来.
证明:
sw.Write(request);
sw.Flush();
var l = sr.ReadLine();
Run Code Online (Sandbox Code Playgroud)
l 正在填充请求的第一行.
删除keep-alive标题并添加:
Connection: close
Run Code Online (Sandbox Code Playgroud)
或者使用响应Content-Length头来正确读取它(二进制).
| 归档时间: |
|
| 查看次数: |
5331 次 |
| 最近记录: |