Класс XmlResolver

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

Тип XmlResolver используется для разрешения внешних XML-ресурсов, таких как сущности, определения типов документов (DTD) или схемы. Он также используется для обработки и импорта элементов, найденных в таблицах стилей XSL или схемах 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 .