如何使用 NetworkStream class 发出 GET 请求?
How to make a GET request using the NetworkStream class?
我正在尝试使用 NetworkStream class 发出 GET 请求。 MyWebServer 没有记录请求,所以我假设请求的格式不正确。
public void MakeRequest()
{
int port = 80;
IPHostEntry host = Dns.GetHostEntry("192.168.1.152");
IPEndPoint endPoint = new IPEndPoint(host.AddressList[0], 80);
using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
socket.Connect(endPoint);
using (NetworkStream ns = new NetworkStream(socket))
{
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(@"GET /MyWebServer HTTP/1.1\r\n");
ns.Write(bytes, 0, bytes.Length);
}
}
}
首先,您不需要使用 Dns.GetHostEntry()
作为 IP 地址,只需使用主机名:
IPEndPoint endPoint = new IPEndPoint("192.168.1.152", 80);
其次,您的请求格式不正确。您缺少 Host
header(HTTP 1.1 要求),并且在请求末尾缺少最后的 \r\n
:
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(@"GET /MyWebServer HTTP/1.1\r\nHost: 192.168.1.152\r\n\r\n");
也就是说,你真的应该使用 HttpWebRequest
or HttpClient
而不是直接使用 NetworkStream
,例如:
using (WebRequest Request = new WebRequest.Create("http://192.168.1.152/MyWebServer"))
{
WebResponse Response = Request.GetResponse();
// use Response as needed...
}
using (HttpClient Client = new HttpClient())
{
client.BaseAddress = new Uri("http://192.168.1.152/");
HttpResponseMessage Response = await Client.GetAsync("MyWebServer");
// use Response as needed...
}
我正在尝试使用 NetworkStream class 发出 GET 请求。 MyWebServer 没有记录请求,所以我假设请求的格式不正确。
public void MakeRequest()
{
int port = 80;
IPHostEntry host = Dns.GetHostEntry("192.168.1.152");
IPEndPoint endPoint = new IPEndPoint(host.AddressList[0], 80);
using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
socket.Connect(endPoint);
using (NetworkStream ns = new NetworkStream(socket))
{
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(@"GET /MyWebServer HTTP/1.1\r\n");
ns.Write(bytes, 0, bytes.Length);
}
}
}
首先,您不需要使用 Dns.GetHostEntry()
作为 IP 地址,只需使用主机名:
IPEndPoint endPoint = new IPEndPoint("192.168.1.152", 80);
其次,您的请求格式不正确。您缺少 Host
header(HTTP 1.1 要求),并且在请求末尾缺少最后的 \r\n
:
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(@"GET /MyWebServer HTTP/1.1\r\nHost: 192.168.1.152\r\n\r\n");
也就是说,你真的应该使用 HttpWebRequest
or HttpClient
而不是直接使用 NetworkStream
,例如:
using (WebRequest Request = new WebRequest.Create("http://192.168.1.152/MyWebServer"))
{
WebResponse Response = Request.GetResponse();
// use Response as needed...
}
using (HttpClient Client = new HttpClient())
{
client.BaseAddress = new Uri("http://192.168.1.152/");
HttpResponseMessage Response = await Client.GetAsync("MyWebServer");
// use Response as needed...
}