XML文档中存在错误...调用Web服务时

时间:2010-12-29 12:42:03

标签: c# xml web-services encoding

我已经创建了一个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. EinarssonTv” ‘fint˜ri

有人能看到我在这里做错了吗?

4 个答案:

答案 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("", "&#xB;");
xml = xml.Replace("", "&#x1;");
doc.LoadXml(xml);
doc.Dump("After");

我无法在此处显示无效字符,这是我所期望的,但您可以使用十六进制编辑器创建它们并将它们放入代码中,然后将它们替换为实体转义字符。

答案 3 :(得分:0)

在return语句之前放置一个Breakpoint,并使用调试工具浏览列表。检查数据是否在集合中具有奇怪的符号。如果是,那么您需要转义这些特殊字符才能将响应序列化。

查看4.5 Framework附带的ASP.NET Web API,您可以更好地控制将响应转换为客户端的序列化程序。