【问题标题】:c# RequestStream changes equal to commac# RequestStream 更改等于逗号
【发布时间】:2013-05-17 22:58:31
【问题描述】:

我有一个程序,我在其中使用 POST 将 XML 消息发送到端点。它在转换为字节数组之前和之后的输出中都正确形成,但是一旦端点接收到它,第一个 = 就会变成 a ,从而导致解析问题。

<?xml version="1.0" encoding="utf-8"?> 变为<?xml version', '"1.0" encoding="utf-8"?>,但仅适用于最外层标签。

谁能澄清为什么会发生这种情况,以及如何防止它?我的任何调整似乎都没有帮助。

谢谢!

(注意:我尝试使用 XML 序列化类,但它的输出量很大,有时每 3 秒高达 9-12 条消息,并且它会导致内存管理问题,因为它为每个生成 csc.exe消息。)

这是我的代码:

        DateTimeOffset dateOffset = new DateTimeOffset(DateTime.Now,
                        TimeZoneInfo.Local.GetUtcOffset(DateTime.Now));


        string xmlToSend = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
            + "<message type=\"" + "VEHICLE" + "\" time=\"" + dateOffset.ToString("o") + "\" "
            + "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">"
            + "<tag1>" + "TESTER" + "</tag1>"
            + "<tag2>" + "TESTER" + "</tag2>"
            + "<tag3>" + "TESTER" + "</tag3>"
            + "<tag4>" + "TESTER" + "</tag4>"
            + "<confidence>" + "TESTER" + "</confidence>"
            + "</message>";

        XmlDocument doc = new XmlDocument();
        doc.LoadXml(xmlToSend);

        Console.WriteLine("doc to string: " + doc.OuterXml);

        byte[] bytes;
        bytes = System.Text.Encoding.ASCII.GetBytes(doc.OuterXml);
        Console.WriteLine("bytes to string: " + Encoding.Default.GetString(bytes));


            Uri temp = new Uri("http://localhost:1337/");


            ThreadPool.QueueUserWorkItem((WaitCallback)delegate(Object myObj)
            {
                try
                {

                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(temp);

                    //Set HttpWebRequest properties

                    request.Method = "POST";
                    request.ContentType = "text/xml; encoding='utf-8'";
                    request.ContentLength = bytes.Length;
                    request.Timeout = 5000;

                    Stream requestStream = request.GetRequestStream();
                    requestStream.Write(bytes, 0, bytes.Length);


                    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                    Console.WriteLine("Endpoint: " + temp.AbsoluteUri + "; Status code: " + response.StatusCode);



                    response.Close();
                    requestStream.Close();
                    request = null;

                }


                catch (Exception e)
                {
                        Console.WriteLine("ERROR: Posting to the endpoint didn't work - " + e.Message + "(" + temp.AbsoluteUri + ")");

                }

            });

这是控制台输出:

doc to string: <?xml version="1.0" encoding="utf-8"?><message type="VEHICLE" tim
e="2013-05-17T15:44:38.3593750-07:00" xmlns:xsi="http://www.w3.org/2001/XMLSchem
a-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><tag1>TESTER</tag1><tag
2>TESTER</tag2><tag3>TESTER</tag3><tag4>TESTER</tag4><confidence>TESTER</confide
nce></message>
bytes to string: <?xml version="1.0" encoding="utf-8"?><message type="VEHICLE" t
ime="2013-05-17T15:44:38.3593750-07:00" xmlns:xsi="http://www.w3.org/2001/XMLSch
ema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><tag1>TESTER</tag1><t
ag2>TESTER</tag2><tag3>TESTER</tag3><tag4>TESTER</tag4><confidence>TESTER</confi
dence></message>
Endpoint: http://localhost:1337/; Status code: OK

和我的本地服务器输出:

[('<?xml version', '"1.0" encoding="utf-8"?><message type="VEHICLE" time="2013-0
5-17T15:44:38.3593750-07:00" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instanc
e" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><tag1>TESTER</tag1><tag2>TESTER<
/tag2><tag3>TESTER</tag3><tag4>TESTER</tag4><confidence>TESTER</confidence></mes
sage>')]

【问题讨论】:

  • 可以查看您的服务器代码。您的服务器正在向您展示一个包含两个字符串的结构。第一个包含 &lt;?xml version,而第二个包含 XML 的其余部分。 XML 说它是 UTF-8,但代码使用 System.Text.Encoding.ASCII 来编码数据,而不是 System.Text.Encoding.UTF8。我不确定这是否是问题的原因,但这无济于事。

标签: c# xml parsing stream httpwebrequest


【解决方案1】:

这是一个编码问题,您的端点会尽最大努力理解包含错误的内容

    bytes = System.Text.Encoding.ASCII.GetBytes(doc.OuterXml);
    Console.WriteLine("bytes to string: " + Encoding.Default.GetString(bytes));

您以 ASCII 编码创建字节,然后使用默认编码(即 ANSI)进行输出。然后,在 XML 和请求内容类型中,您告诉服务器这将是 UTF-8:

    request.ContentType = "text/xml; encoding='utf-8'";

如果可能,您应该始终使用 UTF-8。所以摆脱 ASCII 和 ANSI(默认),使用 UTF-8 编码,你的问题可能会消失。

【讨论】:

  • 我尝试将编码更改为 UTF8,将 ContentType 更改为“application/xml”,但在两个窗口中仍然得到相同的输出。但这仍然是一个很好的改变,以保持一致。
【解决方案2】:

我想知道您的响应内容类型是否默认为错误的值并让客户端感到困惑 - 设置它可能会有所帮助:

response.ContentType = "application/xml";

【讨论】:

  • 我试过了,它并没有改变输出端的任何东西。不过,这仍然是一个很好的改变。
猜你喜欢
  • 1970-01-01
  • 2018-06-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
  • 2012-10-10
  • 2014-11-26
  • 2019-03-14
相关资源
最近更新 更多