我有一个C#方法,它为基于Java的Web服务创建请求。我序列化我的类并将其发布到服务,它返回状态400
,表明它找不到命名的根元素。当使用fiddler时,我接受请求并在Composer中手动构建它并处理它并成功。使用十六进制查看器我注意到从C#发出的请求在标头和请求数据 EF BB BF
之间有以下字符。我在Fiddler中执行的剪切和粘贴请求没有成功。由于我不熟悉Java服务的构建,因此在处理请求时更容易找到告诉Java忽略字符的方法,还是更容易在.Net中构建另一个序列化程序?我不打算在这里开始一场宗教战争,以达到最快的解决方案。
序列化的代码如下:
//seralize the Request
XmlSerializer msgSerializer = new XmlSerializer(Msg.GetType());
try
{
request = (HttpWebRequest)WebRequest.Create(_endpoint);
request.Method = "POST";
request.KeepAlive = true;
request.SendChunked = true;
using (Stream myRequestStream = request.GetRequestStream())
{
XmlTextWriter requestWriter = new XmlTextWriter(myRequestStream, Encoding.UTF8);
msgSerializer.Serialize(requestWriter, Msg);
myRequestStream.Close();
}
response = request.GetResponse();
}
catch (WebException webE)
{
//Yada Yada Yada
...
}
答案 0 :(得分:2)
这是一个UTF-8 byte order mark。它完全有效。
坦率地说,Java代码应该应对它,但解决它的最简单方法可能是指定你不希望它在编码中:
XmlTextWriter requestWriter = new XmlTextWriter(myRequestStream,
new UTF8Encoding(encoderShouldEmitUTF8Identifier: false));
(如果您没有使用C#4或5,只需省略encoderShouldEmitUTF8Identifier:
部分;这是一个命名参数,这使得参数值更清晰。)