我已经创建了一个Web服务及其中的一个函数,该函数应返回从普及数据库中检索的11,000条记录的列表
这是我在网络服务中的功能。
[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;
}
}
然后我在我的客户端程序中添加对此Web服务的Web引用,并调用引用BBI。 然后我调用getAll函数并得到错误:XML文档中存在错误(1,63432)。
public List<BBI.myObject> getAll()
{
BBI.BBI bbi = new BBI.BBI();
List<BBI.myObject> allBooks = bbi.getAll().OfType<BBI.myObject>().ToList();
return allBooks;
}
以下是总异常详细信息
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:
数据库记录包含所有类型的奇怪符号,例如¤rmann Kr. Einarsson
和Tv” ‘fint˜ri
有人能看到我在这里做错了吗?
答案 0 :(得分:2)
使用SoapUI消费服务,发送请求,看看你得到了什么。如果它在SoapUI中看起来很好,那么你知道它正在从数据库正确读取和馈送,并且问题很可能在你的客户端,可能是编码。如果在SoapUI中看起来不对,那么服务器端或数据库中的数据就会出错。
像SoapUI和Fiddler这样的工具很棒,对于这种事情的中间人检查。当您不确定服务器或客户端是否存在问题时,将问题减少一半总是有帮助的。
答案 1 :(得分:1)
您的数据库是否包含这些奇怪的字符?如果是这样,那就是数据库/客户端编码问题。调试服务器时,您能正确看到字符串吗?如果是这样,那就很奇怪了。无论如何,我想我记得如果有0个字符,那么这些SOAP web服务就像抛出错误,但它在WCF中有效,但我再说一遍,我不确定。不过,首先不应该有奇怪的人物。
答案 2 :(得分:1)
你会在这里找到答案:The quest for 0x0B
这是因为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");
我无法在此处显示无效字符,这是我所期望的,但您可以使用十六进制编辑器创建它们并将它们放入代码中,然后将它们替换为实体转义字符。
答案 3 :(得分:0)
在return语句之前放置一个Breakpoint,并使用调试工具浏览列表。检查数据是否在集合中具有奇怪的符号。如果是,那么您需要转义这些特殊字符才能将响应序列化。
查看4.5 Framework附带的ASP.NET Web API,您可以更好地控制将响应转换为客户端的序列化程序。