无法从.Net应用程序发送POST请求,但使用Chrome RESTClient正常工作

3

为什么我使用以下命令以及类似的一些其他代码无法发送POST请求。而当我使用Mozilla浏览器的RESTClient发送相同的请求时,它可以正常工作。这仅适用于部署在本地局域网甚至我的本地机器上的服务器模拟器。对于实际的服务器,它可以正常工作。

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发送的副本相同)。

1个回答

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);
    ...
}

如果你想要POST 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);
}

因此,正如您所看到的,一切都取决于您的服务器端脚本的期望。


"<?xml version='1.0'?><!DOCTYPE svc_init SYSTEM 'MLP_SVC_INIT_320.DTD'><svc_init ver='3.3.0'><hdr ver='3.3.0'><client><id>polaris</id><pwd>polaris123</pwd></client></hdr><slir ver='3.3.0' res_type='SYNC'><msid type='MSISDN'>96893111157</msid><gsm_net_param><neid><vmscid></vmscid></neid></gsm_net_param><trans_id>6</trans_id><eqop><max_loc_age>3600</max_loc_age></eqop></slir></svc_init>" - Imran Rizvi
好的,当你尝试了我的第二个代码示例来向服务器发送这个 XML 时发生了什么? - Darin Dimitrov
我不明白问题出在哪里。 - Darin Dimitrov
你的代码在服务器上也出现了同样的错误,即java.lang.StringIndexOutOfBoundsException: String index out of range: -1 at java.lang.String.substring(Unknown Source) at com.pw.simulator.mlc.Creader.run(Creader.java:42)对于未格式化的xml,这是相同的响应,我没有看到xml有任何问题(与我通过RESTclient发送的副本相同)。我需要对xml进行一些更改或在创建byte []时进行更改吗? - Imran Rizvi
我不知道你需要做什么。我不知道你的服务器端脚本是做什么的,也不知道它希望请求格式是怎样的。没有这些信息,我无法帮助你。 - Darin Dimitrov
刚才我使用实际的MLC服务器(而不是模拟器)检查了代码,它可以正常工作。但仍然不知道为什么这段代码在模拟器上无法工作,而RESTClient却可以正常工作?是否有防火墙设置不允许来自.NET代码的请求? - Imran Rizvi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接