我正在使用第三方DLL,它通过互联网传输XML文档.
为什么DLL会抛出以下异常?
根级别的数据无效.第1行,第1位.(有关完整的异常文本,请参见下文.)
以下是XML文档的前几行:
<?xml version="1.0" encoding="utf-8"?> <REQUEST> <HEADER>
<REQUESTID>8a5f6d56-d56d-4b7b-b7bf-afcf89cd970d</REQUESTID>
<MESSAGETYPE>101</MESSAGETYPE>
<MESSAGEVERSION>3.0.2</MESSAGEVERSION>
Run Code Online (Sandbox Code Playgroud)
例外:
System.ApplicationException was caught
Message=Unexpected exception.
Source=FooSDK
StackTrace:
at FooSDK.RequestProcessor.Send(String SocketServerAddress, Int32 port)
at Foo.ExecuteRequest(Int32 messageID, IPayload payload, Provider prov)
at Foo.SendOrder(Int32 OrderNo)
InnerException: System.Xml.XmlException
LineNumber=1
LinePosition=1
Message=Data at the root level is invalid. Line 1, position 1.
Source=System.Xml
SourceUri=""
StackTrace:
at System.Xml.XmlTextReaderImpl.Throw(Exception e)
at System.Xml.XmlTextReaderImpl.Throw(String res, String arg)
at System.Xml.XmlTextReaderImpl.ParseRootLevelWhitespace()
at System.Xml.XmlTextReaderImpl.ParseDocumentContent()
at System.Xml.XmlTextReaderImpl.Read()
at System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader, Boolean preserveWhitespace)
at System.Xml.XmlDocument.Load(XmlReader reader)
at System.Xml.XmlDocument.LoadXml(String xml) …Run Code Online (Sandbox Code Playgroud) 编辑:我原本以为这与.NET Framework 4.5有关.原来它也适用于.NET Framework 4.0.
Windows Server 2012中的字符串处理方式发生了变化,我试图更好地理解它.似乎StartsWith的行为已经改变.使用.NET Framework 4.0和4.5可以重现该问题.
使用Windows 7上的.NET Framework 4.5,下面的程序打印"False,t".在Windows 2012 Server上,它会打印"True,t".
internal class Program
{
private static void Main(string[] args)
{
string byteOrderMark = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
Console.WriteLine("test".StartsWith(byteOrderMark));
Console.WriteLine("test"[0]);
}
}
Run Code Online (Sandbox Code Playgroud)
换句话说,无论字符串内容如何,StartsWith(ByteOrderMark)都返回true.如果您有使用以下方法尝试剥离字节顺序标记的代码,此代码将在Windows 7上正常工作,但将在Windows 2012上打印"est".
internal class Program
{
private static void Main(string[] args)
{
string byteOrderMark = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
string someString = "Test";
if (someString.StartsWith(byteOrderMark))
someString = someString.Substring(1);
Console.WriteLine("{0}", someString);
Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)
}
我意识到如果你在字符串中有字节顺序标记,你已经做错了,但我们正在与具有此功能的遗留代码集成.我知道我可以通过以下方式解决这个具体问题,但我想更好地理解这个问题.
someString = someString.Trim(byteOrderMark[0]);
Run Code Online (Sandbox Code Playgroud)
Hans Passsant建议使用UTF8Encoding的构造函数,它允许我明确地告诉它发出UTF8标识符.我尝试了这个,但它给出了相同的结果.以下代码在Windows 7和Windows Server 2012之间的输出方面有所不同.在Windows 7上,它打印"Result:False".在Windows Server 2012上,它打印"Result:True".
private static void …Run Code Online (Sandbox Code Playgroud) 我在 localhost:8983/solr/global 上使用Solar:7.0.1
我使用SolrNET 0.8.1 和以下代码示例:
using SolrNet;
using Microsoft.Practices.ServiceLocation;
Startup.Init<SOLRModel>("http://localhost:8983/solr/global");
var solr = ServiceLocator.Current.GetInstance<ISolrOperations<SOLRModel>>();
var results = solr.Query(new SolrQuery("*:*&wt=xml")); // Throws Error Here.
Run Code Online (Sandbox Code Playgroud)
我收到错误:
Data at the root level is invalid. Line 1, position 1.
Run Code Online (Sandbox Code Playgroud)
我使用默认模式,也尝试了 techproducts 示例,得到相同的错误。
我可以导航到:http://localhost:8983/solr/global/select?q= :我得到正常的 JSON 响应。
使用&wt=xml给我格式良好的 XML 响应:
<?xml version="1.0" encoding="UTF-8" ?>
- <response>
- <lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">0</int>
- <lst name="params">
<str name="q">*:*</str>
<str name="wt">xml</str>
</lst>
</lst>
<result name="response" numFound="0" start="0" /> …Run Code Online (Sandbox Code Playgroud)