Java Web服务的C#请求中标头和请求之间的奇怪字符阻止成功

时间:2013-05-08 19:57:38

标签: c# java web-services java-ee xml-serialization

我有一个C#方法,它为基于Java的Web服务创建请求。我序列化我的类并将其发布到服务,它返回状态400,表明它找不到命名的根元素。当使用fiddler时,我接受请求并在Composer中手动构建它并处理它并成功。使用十六进制查看器我注意到从C#发出的请求在标头和请求数据 EF BB BF 之间有以下字符。我在Fiddler中执行的剪切和粘贴请求没有成功。由于我不熟悉Java服务的构建,因此在处理请求时更容易找到告诉Java忽略字符的方法,还是更容易在.Net中构建另一个序列化程序?我不打算在这里开始一场宗教战争,以达到最快的解决方案。

Three Ugly Characters Between Request And Response

序列化的代码如下:

//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
        ...
  }

1 个答案:

答案 0 :(得分:2)

这是一个UTF-8 byte order mark。它完全有效。

坦率地说,Java代码应该应对它,但解决它的最简单方法可能是指定你不希望它在编码中:

XmlTextWriter requestWriter = new XmlTextWriter(myRequestStream,
    new UTF8Encoding(encoderShouldEmitUTF8Identifier: false));

(如果您没有使用C#4或5,只需省略encoderShouldEmitUTF8Identifier:部分;这是一个命名参数,这使得参数值更清晰。)