C# XML over HttpRequest-按照说明删除BOM,仍然得到;根级别的数据无效";
按照post中的说明,我向程序中添加了代码,以消除XML文件开头可能隐藏的任何BOM表。即使如此,我仍然在经历这个错误 '根级别的数据无效'Line='1'位置='1' 在这一点上,我所要做的就是测试一个简单的web服务,它连接到我与之有业务往来的一家公司。他们需要接收一个XML文件,如果创建正确,应该会得到一个响应,我可以稍后解析。我已经和他们的代表确认了XML文件应该正常工作,所以我不得不假设问题出在我的POST操作上。我的代码:C# XML over HttpRequest-按照说明删除BOM,仍然得到;根级别的数据无效";,c#,.net,xml,post,httprequest,C#,.net,Xml,Post,Httprequest,按照post中的说明,我向程序中添加了代码,以消除XML文件开头可能隐藏的任何BOM表。即使如此,我仍然在经历这个错误 '根级别的数据无效'Line='1'位置='1' 在这一点上,我所要做的就是测试一个简单的web服务,它连接到我与之有业务往来的一家公司。他们需要接收一个XML文件,如果创建正确,应该会得到一个响应,我可以稍后解析。我已经和他们的代表确认了XML文件应该正常工作,所以我不得不假设问题出在我的POST操作上。我的代码: public string testOperation(st
public string testOperation(string xmlDocLoc)
{
try
{
XmlDocument doc = new XmlDocument();
XmlDocument parcel = new XmlDocument();
doc.Load(xmlDocLoc);
string un = [removed];
string pw = [removed];
string combine = un + ":" + pw;
string b64UCP = System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(combine));
string _byteOrderMarkUtf8 = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
string xmlAsString = doc.OuterXml;
if (xmlAsString.StartsWith(_byteOrderMarkUtf8))
{
var lastIndex = _byteOrderMarkUtf8.Length - 1;
xmlAsString = xmlAsString.Remove(0, lastIndex);
parcel.LoadXml(xmlAsString);
}
else
{
parcel = doc;
}
HttpWebRequest request = (HttpWebRequest)WebRequest.Create([removed]);
byte[] bytes;
bytes = System.Text.Encoding.ASCII.GetBytes(parcel.ToString());
request.ContentType = "text/xml; encoding='utf-8'";
request.ContentLength = bytes.Length;
request.Method = "POST";
Stream requestStream = request.GetRequestStream();
requestStream.Write(bytes, 0, bytes.Length);
requestStream.Close();
request.Headers.Add("Authorization", "Basic " + b64UCP);
HttpWebResponse response;
response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode == HttpStatusCode.OK)
{
Stream responseStream = response.GetResponseStream();
string responseStr = new StreamReader(responseStream).ReadToEnd();
return responseStr;
}
}
catch (Exception ex)
{
return ex.ToString();
}
return null;
是什么导致此代码抛出此错误?使用更简单的方法删除bom:
var noBom = bom.Replace("\ufeff", string.Empty);
看起来您正在将parcel.ToString()方法传递到您的请求中,但是这并没有正确地输出包xml,而是将字符串“System.xml.Document”放入您的请求中。您可能需要访问XmlDocument的真正xml,但使用本答案中提供的方法之一,可能会有帮助的是生成异常的一行以及xml的第一行。在这段代码中,您将加载两次xml,并且该异常可能会在任意位置引发。如果它是在您第一次加载时抛出的,那么您的删除代码实际上不会被调用。我收到的错误是从远程服务返回的-它属于另一家公司,而不是我。在本例中,调试后,它显示检查BOM的条件实际上没有被调用。这意味着“doc”是通过HttpWebRequest发布的内容。代码一直运行到“return responsest”,即从远程服务返回异常。我认为问题在于XmlDocument。ToString()并没有做您认为它在做的事情。parcel.ToString()将为您提供“System.Xml.Document”。实际上,您只是向服务发送字符串“System.Xml.Document”。您需要使用此处的代码来获取XML文档的字符串内容。这解决了你的问题吗?解决了!谢谢你的帮助!我不想把你的回答归功于我。你介意转载你的评论作为回答,这样我就可以标记这个问题已经解决了吗?