Некоторые потребители нашей веб-службы WCF сталкиваются с исключением при попытке проанализировать наши ответы:
System.InvalidOperationException: There is an error in XML document (5, -349). 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 [Consumer's Code]
Внутреннее исключение выглядит так:
'', hexadecimal value 0x0B, is an invalid character. Line 5, position -349. at System.Xml.XmlTextReaderImpl.Throw(Exception e) at System.Xml.XmlTextReaderImpl.Throw(String res, String[] args) at System.Xml.XmlTextReaderImpl.ThrowInvalidChar(Int32 pos, Char invChar) at System.Xml.XmlTextReaderImpl.ParseNumericCharRefInline(Int32 startPos, Boolean expand, BufferBuilder 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.XmlSerializationReader1.Read43_TextWidgetConfig(Boolean isNullable, Boolean checkType) at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReader1.Read45_TextWidgetInfo(Boolean isNullable, Boolean checkType) at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReader1.Read49_WidgetInfo(Boolean isNullable, Boolean checkType) at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReader1.Read50_InstantPageData(Boolean isNullable, Boolean checkType) at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReader1.Read128_GetInstantPageDataResponse() at Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer141.Deserialize(XmlSerializationReader reader) at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
Возвращаемые данные клиента каким-то образом содержали символы вертикальной табуляции. Глядя на наш XML, мы могли видеть, что эти символы правильно отображаются как 
сущности. Выполнив быстрый поиск в Google, мы обнаружили ошибку с XmlSerializer
, когда он не может обрабатывать определенные объекты, что необходимо исправить, изменив параметр в автоматически сгенерированных средствах чтения XML-прокси.
Потребитель признает, что ему необходимо исправить код на стороне клиента, но он не может быстро решить эту проблему с помощью патча. Они хотели бы, чтобы мы применили патч в нашем собственном коде, чтобы отфильтровать эти запрещенные символы.
- Задокументирован ли где-нибудь список проблемных символов для
XmlSerializer
? - Есть ли у нас чистый способ изменить нашу службу WCF, чтобы мы могли автоматически удалять символы, не прибегая к замене строк во всех наших веб-методах?
Обновление:
Я нашел ответ на №1. Согласно спецификации XML, разрешены только определенные коды символов:
Char :: = # x9 | #xA | #xD | [# x20- # xD7FF] | [# xE000- # xFFFD] | [# x10000- # x10FFFF]
Итак, похоже, что DataContractSerializer
на нашем сервере - это то, что здесь ошибочно. Сейчас я изучаю, как настроить этот сериализатор.
Обновление 2:
Похоже, проблема DataContractSerializer
известна и вошли в Microsoft Connect.
DataContractSerializer
, потребителю нашей веб-службы. Даже WebService Studio подавляется выводом. - person Jacob   schedule 17.02.2011