Поделиться через


Класс XmlResolver

В этой статье приводятся дополнительные замечания к справочной документации по этому API.

Тип XmlResolver используется для разрешения внешних XML-ресурсов, таких как сущности, определения типов документов (DTD) или схемы. Он также используется для обработки элементов включения и импорта, найденных в таблицах стилей XSL или схемах языка определения схем XML (XSD).

XmlResolver обрабатывает все аспекты согласования подключения к ресурсам, включая обработку учетных данных безопасности, открытие подключения к источнику данных и возврат ресурса в виде потока или другого типа объекта. Объект, вызывающий XmlResolver , имеет задачу интерпретации потока.

Пространство System.Xml имен включает в себя две конкретные реализации класса XmlResolver.

  • XmlUrlResolver — это резолвер по умолчанию для всех классов в пространстве имен System.Xml. Он поддерживает протоколы file:// и http://, а также запросы из класса System.Net.WebRequest. Примеры расширения класса для повышения производительности см. на справочной XmlUrlResolver странице.

  • XmlSecureResolver помогает защитить другой XmlResolver объект путем упаковки объекта и ограничения ресурсов, к которым он может получить доступ. Например, можно XmlSecureResolver запретить доступ к определенным интернет-сайтам или зонам.

Вы можете создать и указать собственный сопоставитель. Если не указать резолвер, ридер использует XmlUrlResolver по умолчанию без пользовательских учетных данных.

Укажите XmlResolver для использования, устанавливая свойство XmlReaderSettings.XmlResolver и передавая объект XmlReaderSettings методу Create.

Если ресурс хранится в системе, требующей проверки подлинности, используйте XmlResolver.Credentials свойство для указания необходимых учетных данных.

Укажите учетные данные аутентификации

Файл, содержащий XML-данные для чтения, может иметь политику ограниченного доступа. Если для доступа к сетевому ресурсу требуется проверка подлинности, используйте Credentials свойство, чтобы указать необходимые учетные данные. Если свойство Credentials не задано, учетным данным присваивается значение null.

Например, предположим, что учетные данные необходимы при запросе данных из Интернета в целях проверки подлинности. Если веб-виртуальный каталог не разрешает анонимный доступ, необходимо задать Credentials свойство для предоставления учетных данных. В следующем примере создается объект XmlReader, который использует учетные данные XmlUrlResolver по умолчанию для доступа к сайту http://localhost/bookstore/inventory.xml.

// Create a resolver with default credentials.
XmlUrlResolver resolver = new XmlUrlResolver();
resolver.Credentials = System.Net.CredentialCache.DefaultCredentials;

// Set the reader settings object to use the resolver.
settings.XmlResolver = resolver;

// Create the XmlReader object.
XmlReader reader = XmlReader.Create("http://ServerName/data/books.xml", settings);
' Create a resolver with default credentials.
Dim resolver as XmlUrlResolver = new XmlUrlResolver()
resolver.Credentials = System.Net.CredentialCache.DefaultCredentials

' Set the reader settings object to use the resolver.
settings.XmlResolver = resolver

' Create the XmlReader object.
Dim reader as XmlReader = XmlReader.Create("http://ServerName/data/books.xml", settings)

Вы можете указать разные учетные данные для разных URI и добавить их в кэш. Эти учетные данные используются для проверки подлинности для различных URI независимо от исходного источника XML. В следующем примере показано, как добавить учетные данные в кэш.

// Create the credentials.
NetworkCredential myCred = new NetworkCredential(UserName,SecurelyStoredPassword,Domain);
CredentialCache myCache = new CredentialCache();
myCache.Add(new Uri("http://www.contoso.com/"), "Basic", myCred);
myCache.Add(new Uri("http://app.contoso.com/"), "Basic", myCred);

// Set the credentials on the XmlUrlResolver object.
XmlUrlResolver resolver = new XmlUrlResolver();
resolver.Credentials = myCache;

// Compile the style sheet.
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load("http://serverName/data/xsl/order.xsl",XsltSettings.Default, resolver);
' Create the credentials.
Dim myCred As NetworkCredential = New NetworkCredential(UserName,SecurelyStoredPassword,Domain)
Dim myCache As CredentialCache = New CredentialCache()
myCache.Add(new Uri("http://www.contoso.com/"), "Basic", myCred)
myCache.Add(new Uri("http://app.contoso.com/"), "Basic", myCred)

' Set the credentials on the XmlUrlResolver object.
Dim resolver As XmlUrlResolver = New XmlUrlResolver()
resolver.Credentials = myCache

' Compile the style sheet.
Dim xslt As XslCompiledTransform = New XslCompiledTransform()
xslt.Load("http://serverName/data/xsl/order.xsl", XsltSettings.Default, resolver)

Вопросы безопасности

При работе с классом XmlResolver рассмотрите следующие элементы.

  • XmlResolver объекты могут содержать конфиденциальную информацию, например учетные данные пользователя. При кэшировании XmlResolver объектов следует быть осторожным и не следует передавать XmlResolver объект в ненадежный компонент.

  • Если вы разрабатываете свойство класса, использующее XmlResolver класс, свойство должно быть определено как свойство только для записи. Свойство можно использовать для указания используемого XmlResolver, но его нельзя использовать для возврата объекта XmlResolver.

  • Если приложение принимает XmlResolver объекты из ненадежного кода, нельзя предположить, что URI, переданный в GetEntity метод, будет совпадать с тем, что возвращается методом ResolveUri . Классы, производные от XmlResolver класса, могут переопределить GetEntity метод и возвращать данные, отличные от того, что было в исходном URI.

  • Приложение может снизить угрозы отказа в обслуживании памяти для GetEntity метода, реализуя IStream ограничение количества байтов, считываемых. Это помогает защититься от ситуаций, когда вредоносный код пытается передать бесконечный поток байтов методу GetEntity .