Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XML over HttpRequest-按照说明删除BOM,仍然得到;根级别的数据无效";_C#_.net_Xml_Post_Httprequest - Fatal编程技术网

C# XML over HttpRequest-按照说明删除BOM,仍然得到;根级别的数据无效";

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

按照post中的说明,我向程序中添加了代码,以消除XML文件开头可能隐藏的任何BOM表。即使如此,我仍然在经历这个错误

'根级别的数据无效'Line='1'位置='1'

在这一点上,我所要做的就是测试一个简单的web服务,它连接到我与之有业务往来的一家公司。他们需要接收一个XML文件,如果创建正确,应该会得到一个响应,我可以稍后解析。我已经和他们的代表确认了XML文件应该正常工作,所以我不得不假设问题出在我的POST操作上。我的代码:

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文档的字符串内容。这解决了你的问题吗?解决了!谢谢你的帮助!我不想把你的回答归功于我。你介意转载你的评论作为回答,这样我就可以标记这个问题已经解决了吗?