В XML-документе произошла ошибка ... При обращении к веб-сервису - PullRequest
3 голосов
/ 29 декабря 2010

Я создал веб-сервис и функцию в нем, которая должна возвращать список из 11 тысяч записей, полученных из всеобъемлющей базы данных

Вот моя функция в веб-сервисе.

[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;
    }
}

Затем я добавляю веб-ссылку на этот веб-сервис в моей клиентской программе и вызываю ссылку 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

.

Может кто-то увидеть, что я здесь делаю неправильно?

Ответы [ 4 ]

2 голосов
/ 29 декабря 2010

Воспользуйтесь сервисом с SoapUI, отправьте запрос и посмотрите, что вы получите.Если он выглядит хорошо в SoapUI, то вы знаете, что он правильно считывается и подается из базы данных, и проблема, скорее всего, связана с вашим клиентом, возможно, с кодировкой.Если это выглядит неправильно в SoapUI, то это неправильно на стороне сервера или с данными в базе данных.

Такие инструменты, как SoapUI и Fiddler, хороши для проверок посредников такого рода,А когда вы не уверены, что это проблема на сервере или на клиенте, всегда полезно сократить проблему пополам.

1 голос
/ 07 декабря 2011

Ответ вы найдете здесь: Квест на 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");

Я не могу получитьнедопустимые символы для отображения здесь, что я ожидал, но вы можете создать их с помощью шестнадцатеричного редактора и вставить их в свой код, а затем заменить их на escape-символы объекта.

1 голос
/ 29 декабря 2010

Содержит ли ваша база данных эти странные символы?Если так, то это проблема кодировки базы данных / клиента.Можете ли вы правильно увидеть строки при отладке сервера?Если так, то это очень странно.В любом случае, я думаю, что помню, что если есть символы \ 0, то эти веб-сервисы SOAP любят генерировать ошибки, но это работает в WCF, но повторюсь, я не уверен.Тем не менее, в первую очередь не должно быть странных персонажей.

0 голосов
/ 17 февраля 2013

Установите точку останова прямо перед оператором return и изучите список с помощью инструментов отладки. Проверьте, есть ли в данных странные символы внутри коллекции. Если это так, то вам нужно экранировать эти специальные символы для сериализации ответа.

Проверьте ASP.NET Web API, который поставляется с 4.5 Framework, у вас есть больше контроля над сериализатором, который преобразует ответ клиентам.

...