c#请求流更改等于逗号

c#请求流更改等于逗号,c#,xml,parsing,stream,httpwebrequest,C#,Xml,Parsing,Stream,Httpwebrequest,我有一个程序,使用POST向端点发送XML消息。它在转换为字节数组之前和之后都在输出中正确形成,但一旦端点接收到它,第一个=就会变成一个,从而导致解析问题 ie变为,但仅适用于最外层的标签 有人能澄清为什么会发生这种情况,以及如何预防吗?我的任何调整似乎都没有帮助 谢谢 (注意:我尝试使用XML序列化类,但它的输出量很大,有时高达每3秒9-12条消息,并且它会导致内存管理问题,因为它会为每条消息生成csc.exe。) 这是我的密码: DateTimeOffset dateOffs

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

ie
变为
,但仅适用于最外层的标签

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

谢谢

(注意:我尝试使用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 + ")");

                }

            });
DateTimeOffset dateOffset=新的DateTimeOffset(DateTime.Now,
TimeZoneInfo.Local.GetUtcOffset(DateTime.Now));
字符串xmlToSend=“”
+ ""
+“+”测试仪“+”
+“+”测试仪“+”
+“+”测试仪“+”
+“+”测试仪“+”
+“+”测试仪“+”
+ "";
XmlDocument doc=新的XmlDocument();
doc.LoadXml(xmlToSend);
Console.WriteLine(“文档到字符串:+doc.OuterXml”);
字节[]字节;
字节=System.Text.Encoding.ASCII.GetBytes(doc.OuterXml);
WriteLine(“字节到字符串:+Encoding.Default.GetString(bytes));
Uri temp=新Uri(“http://localhost:1337/");
ThreadPool.QueueUserWorkItem((WaitCallback)委托(对象myObj)
{
尝试
{
HttpWebRequest请求=(HttpWebRequest)WebRequest.Create(temp);
//设置HttpWebRequest属性
request.Method=“POST”;
request.ContentType=“text/xml;encoding='utf-8';
request.ContentLength=字节.Length;
请求超时=5000;
Stream requestStream=request.GetRequestStream();
requestStream.Write(字节、0、字节、长度);
HttpWebResponse=(HttpWebResponse)request.GetResponse();
Console.WriteLine(“端点:+temp.AbsoluteUri+”;状态代码:+response.StatusCode);
response.Close();
requestStream.Close();
请求=null;
}
捕获(例外e)
{
Console.WriteLine(“错误:向终结点发布不起作用-”+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
文档到字符串:TesterTesterTester
字节到字符串:TesterTesterTester
终点:http://localhost:1337/; 状态代码: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>')]
[('TESTERTESTER<
/tag2>TesterTester')]

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

    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编码,您的问题可能会消失。

我想知道您的响应内容类型是否默认为错误的值并混淆了客户端-设置它可能会有帮助:

response.ContentType = "application/xml";

可以查看您的服务器代码。您的服务器正在向您显示一个包含两个字符串的结构。第一个包含
我尝试将编码更改为UTF8,将ContentType更改为“application/xml”,但在两个窗口中仍然得到相同的输出。但为了保持一致性,这仍然是一个很好的改变。我试过了,但在输出端没有任何改变。但这仍然是一个很好的改变。