[英]How to view the request being sent in c#
我正在研究以下代码。
Int32 port = 7101;
IPAddress localAddr1 = IPAddress.Parse("117.239.85.13");
MemoryStream ms = new MemoryStream();
XmlDocument doc = new XmlDocument();
String message_text = "<estel><header><requesttype>CREDIT</requesttype></header><request><agentcode>910000006789</agentcode><vendorcode>HELLOTV</vendorcode><pin>***************</pin><destination>919555518484</destination><agenttransid>*****</agenttransid><amount>10</amount><productcode>SKUA</productcode><clienttype>portal</clienttype><comments>abcd</comments></request></estel>";
doc.LoadXml(message_text);
doc.Save(ms);
ms.Seek(0, SeekOrigin.Begin);
Byte[] data = ms.ToArray();
TcpClient client = new TcpClient();
client.Connect(localAddr1, port);
MessageBox.Show(client.Connected.ToString()); // Connection was established here. Returns TRUE value
NetworkStream stream = client.GetStream();
StreamWriter writer = new StreamWriter(stream, Encoding.UTF8);
writer.AutoFlush = false;
writer.Write(Encoding.UTF8.GetBytes(message_text).Length);
writer.Flush();
stream.Write(data, 0, data.Length);
MessageBox.Show(stream.DataAvailable.ToString()); // Returns TRUE value
Byte[] bytes = new Byte[client.ReceiveBufferSize];
string responseData;
stream.Read(bytes, 0, Convert.ToInt32(client.ReceiveBufferSize));
responseData = Encoding.UTF8.GetString(bytes); // We are getting response here
stream.Close();
client.Close();
textBox1.Text = responseData.ToString();
在这里,我正在使用IP和端口号向Web服务提供商发送XML数据。 发送请求后,我得到以下响应15次
<estel><header><responsetype>INVALID REQUEST</responsetype></header></estel>
似乎附加了一些额外的内容。 如何查看正在发送的请求,以便我可以更正它?
您希望发送什么?
NetworkStream stream = client.GetStream();
StreamWriter writer = new StreamWriter(stream, Encoding.UTF8);
writer.AutoFlush = false;
writer.Write(Encoding.UTF8.GetBytes(message_text).Length);
看起来您正在将xml文档的长度写到内容之前的流中。
我希望您输入到流中的输出是这样的: 357<estel><header><requesttype>CREDIT</requesttype></header><request><agentcode>910000006789</agentcode><vendorcode>HELLOTV</vendorcode><pin>***************</pin><destination>919555518484</destination><agenttransid>*****</agenttransid><amount>10</amount><productcode>SKUA</productcode><clienttype>portal</clienttype><comments>abcd</comments></request></estel>
请注意开头的数字。 这是文件的长度。
您正在对该MemoryStream
进行很多多余的处理。 不需要。 对于一些更简洁的代码,请删除ms
和data
然后尝试以下操作:
NetworkStream stream = client.GetStream();
StreamWriter writer = new StreamWriter(stream, Encoding.UTF8);
writer.AutoFlush = false;
writer.Write(doc.Value.Length); //is this line intended? Take it out, see what happens!
writer.Write(doc.Value);
writer.Flush();
为什么这样做? XmlNode.Value
为您提供节点的字符串内容。 就您而言,这就是整个文档的内容。 您的StreamWriter
已设置为要使用的编码UTF-8
。 如果将字符串传递给它,它将为您执行Encoding.UTF8.GetBytes()
调用!
我在写一个类似的程序,向ncell发送请求。 我遇到同样的问题,但找到了解决方案。 问题在于xml字符串格式。 如telnet中所测试,在xml请求的末尾需要换行。
String message_text = "<estel><header><requesttype>CREDIT</requesttype></header><request><agentcode>910000006789</agentcode> <vendorcode>HELLOTV</vendorcode><pin>***************</pin> <destination>919555518484</destination><agenttransid>*****</agenttransid> <amount>10</amount><productcode>SKUA</productcode> <clienttype>portal</clienttype><comments>abcd</comments></request></estel>"
+ Environment.NewLine;
Byte[] data = Encoding.UTF8.GetBytes(message_text);
stream.Write(data, 0, data.Length);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.