C# XML文档中存在错误。。。调用web服务时
我已经创建了一个web服务和其中的一个函数,它应该返回从普及数据库检索到的11000条记录的列表 下面是我在web服务中的功能C# XML文档中存在错误。。。调用web服务时,c#,xml,web-services,encoding,C#,Xml,Web Services,Encoding,我已经创建了一个web服务和其中的一个函数,它应该返回从普及数据库检索到的11000条记录的列表 下面是我在web服务中的功能 [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] public class BBI : System.Web.Ser
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class BBI : System.Web.Services.WebService
{
[WebMethod]
public List<myObject> getAll()
{
List<myObject> result = new List<myObject>();
PsqlConnection conn = new PsqlConnection("Host=soemthing;Port=something;Database=something;Encoding=IBM861");
conn.Open();
string strSql = "select 0, 1, 2, 3, 4, 5 from something";
PsqlCommand DBCmd = new PsqlCommand(strSql, conn);
PsqlDataReader myDataReader;
myDataReader = DBCmd.ExecuteReader();
while (myDataReader.Read())
{
myObject b = new myObject();
b.0 = Convert.ToInt32(myDataReader[0].ToString());
b.1 = myDataReader[1].ToString();
b.2 = myDataReader[2].ToString();
b.3 = myDataReader[3].ToString();
b.4 = myDataReader[4].ToString();
b.5 = myDataReader[5].ToString();
result.Add(b);
}
conn.Close();
myDataReader.Close();
return result;
}
}
数据库记录包含各种奇怪的符号,例如·rmann Kr.Einarsson
和Tv“'fintri
有人能看出我做错了什么吗?您的数据库是否包含这些奇怪的字符?如果是这样,那就是数据库/客户机编码问题。调试服务器时,您能正确地看到字符串吗?如果是这样,那就很奇怪了。无论如何,我想我记得,如果有\0个字符,那么这些SOAP Web服务喜欢抛出错误,但它在WCF中工作,但我重复一遍,我不确定。不过,首先不应该有奇怪的字符。使用SoapUI使用服务,发送请求,然后看看您得到了什么。如果它在SoapUI中看起来不错,那么您就知道它是从数据库中正确读取和馈送的,问题可能出在您的客户机上,可能是编码上。如果在SoapUI中出现错误,则表明服务器端或数据库中的数据有问题
像SoapUI和Fiddler这样的工具对于中间人来说是很棒的。当您不确定这是服务器还是客户端的问题时,将问题一分为二总是有帮助的。您可以在这里找到答案: 这是因为XML中不允许使用某些字符,必须用转义实体替换或删除这些字符。正如上面的链接中所提到的,要找到它可能很困难 以下是一些代码,如果它保留了字符,则会复制问题:
string xml = @"<title></title>";
var doc = new XmlDocument();
// Fails before escaping invalid chars.
try {
doc.LoadXml(xml);
} catch(XmlException ex) {
ex.Dump("Before");
}
// Works after escaping.
xml = xml.Replace("", "");
xml = xml.Replace("", "");
doc.LoadXml(xml);
doc.Dump("After");
stringxml=@”;
var doc=新的XmlDocument();
//在转义无效字符之前失败。
试一试{
doc.LoadXml(xml);
}捕获(XmlException-ex){
交货前(“交货前”);
}
//逃跑后工作。
xml=xml.Replace(“,”和#xB;”);
xml=xml.Replace(“,”;”);
doc.LoadXml(xml);
文件转储(“之后”);
我无法在此处显示我所期望的无效字符,但您可以使用十六进制编辑器创建它们并将其传递到代码中,然后用实体转义字符替换它们。在return语句之前放置一个断点,并使用调试工具浏览列表。检查数据在集合中是否有奇怪的符号。如果确实如此,则需要转义这些特殊字符,以便序列化响应
查看4.5框架附带的ASP.NET Web API,您可以更好地控制将响应转换为客户端的序列化程序 数据库包含这些字符,但在调试服务器时已消失。然而,有这个迹象\“当应该有引用的时候。我认为这可能会弄乱XML。XmlSerializer有点崩溃,因为它无法发送这些无效字符。也许有解决办法,试试谷歌搜索。但是,最好的解决方案是正确处理数据库中的编码。这样,就不会有任何无效字符引起问题。通过在发送前将文本转换为字节来解决
System.InvalidOperationException was unhandled by user code
Message=There is an error in XML document (1, 71897).
Source=System.Xml
StackTrace:
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle)
at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
at BBI.BBI.getAllBooks() in c:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\vefur\73db60db\a4ee31dd\App_WebReferences.jl1r8jv6.0.cs:line 252
at webServiceFuncions.getAllBooks() in c:\Documents and Settings\forritari\Desktop\Vefur - Nýr\BBI\trunk\Vefur\App_Code\webServiceFuncions.cs:line 59
InnerException: System.Xml.XmlException
Message='', hexadecimal value 0x01, is an invalid character. Line 1, position 71897.
Source=System.Xml
LineNumber=1
LinePosition=71897
SourceUri=""
StackTrace:
at System.Xml.XmlTextReaderImpl.Throw(Exception e)
at System.Xml.XmlTextReaderImpl.Throw(String res, String[] args)
at System.Xml.XmlTextReaderImpl.Throw(Int32 pos, String res, String[] args)
at System.Xml.XmlTextReaderImpl.ParseNumericCharRefInline(Int32 startPos, Boolean expand, StringBuilder internalSubsetBuilder, Int32& charCount, EntityType& entityType)
at System.Xml.XmlTextReaderImpl.ParseCharRefInline(Int32 startPos, Int32& charCount, EntityType& entityType)
at System.Xml.XmlTextReaderImpl.ParseText(Int32& startPos, Int32& endPos, Int32& outOrChars)
at System.Xml.XmlTextReaderImpl.ParseText()
at System.Xml.XmlTextReaderImpl.ParseElementContent()
at System.Xml.XmlTextReaderImpl.Read()
at System.Xml.XmlTextReader.Read()
at System.Xml.XmlReader.ReadElementString()
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderBBI.Read2_Book(Boolean isNullable, Boolean checkType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderBBI.Read20_getAllBooksResponse()
at Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer35.Deserialize(XmlSerializationReader reader)
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
InnerException:
string xml = @"<title></title>";
var doc = new XmlDocument();
// Fails before escaping invalid chars.
try {
doc.LoadXml(xml);
} catch(XmlException ex) {
ex.Dump("Before");
}
// Works after escaping.
xml = xml.Replace("", "");
xml = xml.Replace("", "");
doc.LoadXml(xml);
doc.Dump("After");