通过 c# 中的 tcp 连接发出 post 请求
Make a post request through a tcp connection in c#
我问这个问题主要是为了学习。首先,我尝试发出常规 post 请求,但出现此错误:C#: Handling WebClient "protocol violation"。然后我尝试建立一个原始连接以了解发生了什么并最终成为古玩。
无论如何这是我的问题:
我正在使用 fiddler 来捕获我试图复制的 post 请求。以下是在 fiddler 上捕获请求时的样子:
请注意,顶部是我的请求,底部是我的回复。另请参阅我的回复是 200 OK
另一个证明这是有效的 是当我 运行 这个 curl 命令时:
请注意我是如何收到回复的。
现在我想用 c# 做同样的事情这是我的代码:
// connect to device
TcpClient client = new TcpClient();
client.Connect(System.Net.IPAddress.Parse("170.55.7.163"), 80);
// create post data to be sent
string postDataAsString = @"POST http://170.55.7.163/cgi-bin/api.values.post HTTP/1.1" + Environment.NewLine +
"Host: 170.55.7.163" + Environment.NewLine +
"Content-Length: 25" + Environment.NewLine +
Environment.NewLine +
Environment.NewLine +
"P270=2&sid=3dc7588be24f";
byte[] postDataBinary = System.Text.Encoding.UTF8.GetBytes(postDataAsString);
// make post request
client.Client.Send(postDataBinary);
// get response
byte[] bytes = new byte[1024];
int lengthOfResponse = client.Client.Receive(bytes);
var resp = System.Text.Encoding.UTF8.GetString(bytes, 0, lengthOfResponse);
// I get a bad request in here why!?
为什么我没有收到 200 响应?我能做错什么:/。我想知道我做错了什么。
在浪费了 4 个小时的好奇心之后,我发现了问题所在。我改变了:
string postDataAsString = @"POST http://170.55.7.163/cgi-bin/api.values.post HTTP/1.1" + Environment.NewLine +
"Host: 170.55.7.163" + Environment.NewLine +
"Content-Length: 25" + Environment.NewLine +
Environment.NewLine +
Environment.NewLine +
"P270=2&sid=3dc7588be24f";
到
string postDataAsString = @"POST /cgi-bin/api.values.post HTTP/1.1" + Environment.NewLine +
"Host: 170.55.7.163" + Environment.NewLine +
"Content-Length: 25" + Environment.NewLine +
Environment.NewLine +
Environment.NewLine +
"P270=2&sid=6aec588bfe62";
从第一行删除 http://170.55.7.163
解决了问题。我认为代码没有问题,问题是 170.55.7.163 上的 http 服务器 运行。
我问这个问题主要是为了学习。首先,我尝试发出常规 post 请求,但出现此错误:C#: Handling WebClient "protocol violation"。然后我尝试建立一个原始连接以了解发生了什么并最终成为古玩。
无论如何这是我的问题:
我正在使用 fiddler 来捕获我试图复制的 post 请求。以下是在 fiddler 上捕获请求时的样子:
请注意,顶部是我的请求,底部是我的回复。另请参阅我的回复是 200 OK
另一个证明这是有效的 是当我 运行 这个 curl 命令时:
现在我想用 c# 做同样的事情这是我的代码:
// connect to device
TcpClient client = new TcpClient();
client.Connect(System.Net.IPAddress.Parse("170.55.7.163"), 80);
// create post data to be sent
string postDataAsString = @"POST http://170.55.7.163/cgi-bin/api.values.post HTTP/1.1" + Environment.NewLine +
"Host: 170.55.7.163" + Environment.NewLine +
"Content-Length: 25" + Environment.NewLine +
Environment.NewLine +
Environment.NewLine +
"P270=2&sid=3dc7588be24f";
byte[] postDataBinary = System.Text.Encoding.UTF8.GetBytes(postDataAsString);
// make post request
client.Client.Send(postDataBinary);
// get response
byte[] bytes = new byte[1024];
int lengthOfResponse = client.Client.Receive(bytes);
var resp = System.Text.Encoding.UTF8.GetString(bytes, 0, lengthOfResponse);
// I get a bad request in here why!?
为什么我没有收到 200 响应?我能做错什么:/。我想知道我做错了什么。
在浪费了 4 个小时的好奇心之后,我发现了问题所在。我改变了:
string postDataAsString = @"POST http://170.55.7.163/cgi-bin/api.values.post HTTP/1.1" + Environment.NewLine +
"Host: 170.55.7.163" + Environment.NewLine +
"Content-Length: 25" + Environment.NewLine +
Environment.NewLine +
Environment.NewLine +
"P270=2&sid=3dc7588be24f";
到
string postDataAsString = @"POST /cgi-bin/api.values.post HTTP/1.1" + Environment.NewLine +
"Host: 170.55.7.163" + Environment.NewLine +
"Content-Length: 25" + Environment.NewLine +
Environment.NewLine +
Environment.NewLine +
"P270=2&sid=6aec588bfe62";
从第一行删除 http://170.55.7.163
解决了问题。我认为代码没有问题,问题是 170.55.7.163 上的 http 服务器 运行。