为什么我无法使用以下命令和其他类似的代码发送POST请求。当我使用Mozilla浏览器的RESTClient发送相同的请求时,它可以正常工作。这仅适用于部署在LAN /甚至本地计算机上的服务器模拟器。使用Live服务器它工作正常。
ASCIIEncoding encoding = new ASCIIEncoding();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://192.168.220.12:5000"); // this is my system's local ip
byte[] byteArray = encoding.GetBytes("hello");
request.Method = "POST";
request.ContentType = "text/xml";// i tried it with "application/x-www-form-urlencoded" as well
request.ContentLength = byteArray.Length;
Stream dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Flush();
dataStream.Close();
WebResponse response = request.GetResponse();
Console.WriteLine(((HttpWebResponse)response).StatusDescription);
dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
string responseFromServer = reader.ReadToEnd();
Console.WriteLine(responseFromServer);
Console.ReadKey();
reader.Close();
dataStream.Close();
response.Close();
通过在服务器上测试它,我看到有成功接收请求的消息,但它没有显示从上面的代码收到的数据,而是显示来自RESTclient的数据。
可能的原因是什么?是否有任何防火墙不允许从.net库发送postdata到模拟器?
对于未格式化的xml,这是相同的响应,我没有看到xml有什么问题(我通过RESTclient发送的相同副本)。
答案 0 :(得分:3)
目前尚不清楚服务器期望请求的内容类型。如果是application/x-www-form-urlencoded
(键=值对),您可以简化代码:
using (var client = new WebClient())
{
var values = new NameValueCollection
{
{ "key1", "value1" },
{ "key2", "value2" },
};
byte[] result = client.UploadValues("http://192.168.220.12:5000", values);
string resultStr = Encoding.Default.GetString(result);
...
}
如果你想发布XML,那么:
using (var client = new WebClient())
{
client.Headers[HttpRequestHeader.ContentType] = "text/xml";
string xml = "<foo>Bar</foo>";
string result = client.UploadString("http://192.168.220.12:5000", xml);
}
正如您所看到的,它将取决于您的服务器端脚本所期望的内容。