Обработка незаконных значений XML при чтении писем с EWS
У нас есть приложение, которое использует StreamingSubscriptionConnection
для чтения каждого письма, которое отправляется на конкретный почтовый ящик. Проблема, с которой я сталкиваюсь несколько раз в день во время разработки, получает исключение {"'{square character}', hexadecimal value 0x1F, is an invalid character. Line 1, position 1."}
.
Вот трассировка стека:
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.ThrowInvalidChar(Int32 pos, Char invChar)
at System.Xml.XmlTextReaderImpl.ParseText(Int32& startPos, Int32& endPos, Int32& outOrChars)
at System.Xml.XmlTextReaderImpl.ParseText()
at System.Xml.XmlTextReaderImpl.ParseDocumentContent()
at System.Xml.XmlTextReaderImpl.Read()
at Microsoft.Exchange.WebServices.Data.EwsXmlReader.Read()
at Microsoft.Exchange.WebServices.Data.EwsXmlReader.Read(XmlNodeType nodeType)
at Microsoft.Exchange.WebServices.Data.EwsXmlReader.InternalReadElement(XmlNamespace xmlNamespace, String localName, XmlNodeType nodeType)
at Microsoft.Exchange.WebServices.Data.EwsXmlReader.ReadStartElement(XmlNamespace xmlNamespace, String localName)
at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.ReadResponse(EwsServiceXmlReader ewsXmlReader)
Как я могу безопасно читать электронные письма с EWS, содержащие недопустимые символы?
После долгих поисков появилась возможность исправить эту проблему со старыми версиями EWS API. Однако с новейшей версией управляемого API никто, похоже, не имеет исправления.
Это перекрестный столбец http://social.technet.microsoft.com/Forums/en-US/exchangesvrdevelopment/thread/22863099-1d93-47ac-a11b-08c6bf7facea.
Мне снова удалось получить исключение, и вот полный стек и что Exchange превращается в уведомление.
Я использую Exchange 2010 SP1.
![EWS Notification Exception]()
Изменить: я возрождаю этот вопрос, так как это вызывает у меня серьезные проблемы, и в исходном вопросе четко указывается проблема. Я ищу клиентские решения, которые изменяют поведение управляемого EWS API для фильтрации недопустимых символов из XML и исключения исключений. Исправления сервера Exchange вряд ли будут вариантом, если только они не являются простыми изменениями конфигурации. Мое программное обеспечение будет работать с клиентскими серверами Exchange, которые я не контролирую.
Ответы
Ответ 1
Общим обходным решением было бы написать служебную программу, которая следит за папками входящих сообщений в качестве фонового процесса, , если вы не можете решить проблему получения недопустимых файлов XML:
Эта программа сделает следующее:
Вы должны быть в состоянии безопасно заменить все непечатаемые символы ниже US-ASCII 32 с такой escape-последовательностью, за исключением "\r", "\n" и "\t". Тем не менее, вам также необходимо убедиться, что вы никогда не повредите файлы XML и что измененные XML файлы все еще могут использоваться какой бы системой они ни использовались.
Или найдите одну из наиболее распространенных библиотек дезинфекции XML.