Подтвердить что ты не робот

.NET: Предотвратите получение XmlDocument.LoadXml из DTD

У меня есть следующий код (С#), он занимает слишком много времени и вызывает исключение:

new XmlDocument().
LoadXml("<?xml version='1.0' ?><!DOCTYPE note SYSTEM 'http://someserver/dtd'><note></note>");

Я понимаю, почему он это делает. Мой вопрос: как мне заставить его остановиться? Меня не интересует проверка DTD. Я полагаю, я мог бы просто regex-заменить его, но я ищу более элегантное решение.

Фон:
Фактический XML получен с веб-сайта, который у меня нет. Когда сайт проходит техническое обслуживание, он возвращает XML с DOCTYPE, который указывает на DTD, который недоступен во время обслуживания. Поэтому мой сервис становится ненужным медленным, потому что он пытается получить DTD для каждого XML, который мне нужно проанализировать.

Вот стек исключений:

Unhandled Exception: System.Net.WebException: The remote name could not be resolved: 'someserver'
at System.Net.HttpWebRequest.GetResponse()
at System.Xml.XmlDownloadManager.GetNonFileStream(Uri uri, ICredentials credentials)
at System.Xml.XmlDownloadManager.GetStream(Uri uri, ICredentials credentials)
at System.Xml.XmlUrlResolver.GetEntity(Uri absoluteUri, String role, Type ofObjectToReturn)
at System.Xml.XmlTextReaderImpl.OpenStream(Uri uri)
at System.Xml.XmlTextReaderImpl.DtdParserProxy_PushExternalSubset(String systemId, String publicId)
at System.Xml.XmlTextReaderImpl.DtdParserProxy.System.Xml.IDtdParserAdapter.PushExternalSubset(String systemId, String publicId)
at System.Xml.DtdParser.ParseExternalSubset()
at System.Xml.DtdParser.ParseInDocumentDtd(Boolean saveInternalSubset)
at System.Xml.DtdParser.Parse(Boolean saveInternalSubset)
at System.Xml.XmlTextReaderImpl.DtdParserProxy.Parse(Boolean saveInternalSubset)
at System.Xml.XmlTextReaderImpl.ParseDoctypeDecl()
at System.Xml.XmlTextReaderImpl.ParseDocumentContent()
at System.Xml.XmlTextReaderImpl.Read()
at System.Xml.XmlLoader.LoadDocSequence(XmlDocument parentDoc)
at System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader, Boolean preserveWhitespace)
at System.Xml.XmlDocument.Load(XmlReader reader)
at System.Xml.XmlDocument.LoadXml(String xml)
at ConsoleApplication36.Program.Main(String[] args) in c:\Projects\temp\ConsoleApplication36\Program.cs:line 11
4b9b3361

Ответ 1

Ну, в .NET 4.0 XmlTextReader имеет свойство DtdProcessing. Если установлено значение DtdProcessing.Ignore, он должен отключить обработку DTD.

Ответ 2

В .net 4.5.1 Мне не удавалось установить doc.XmlResolver в значение null.

Самое простое исправление для меня состояло в том, чтобы использовать замену строки для замены "xmlns =" на "ignore =" перед вызовом LoadXml(), например.

var responseText = await response.Content.ReadAsStringAsync();
responseText = responseText.Replace("xmlns=", "ignore=");
try
{
    var doc = new XmlDocument();
    doc.LoadXml(responseText);
    ...
}