繁体   English   中英

如何查看以C#发送的请求

[英]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进行很多多余的处理。 不需要。 对于一些更简洁的代码,请删除msdata然后尝试以下操作:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM