Compartilhar via


Classe XmlResolver

Este artigo fornece observações complementares à documentação de referência para essa API.

O tipo XmlResolver é usado para resolver recursos XML externos, como entidades, definições de tipo de documento (DTDs) ou esquemas. Também é utilizado para processar elementos de inclusão e importação encontrados em folhas de estilo de Linguagem XSL (XSL) ou Linguagem de Definição de Esquema XML (XSD).

XmlResolver trata de todos os aspectos da negociação da conexão com os recursos, incluindo o tratamento de credenciais de segurança, a abertura da conexão com a fonte de dados e o retorno do recurso na forma de um fluxo ou outro tipo de objeto. O objeto que chama XmlResolver tem a tarefa de interpretar o fluxo.

O namespace System.Xml inclui duas implementações concretas da classe XmlResolver:

  • XmlUrlResolver é o resolvedor padrão para todas as classes no namespace System.Xml. Suporta file:// e os protocolos e as solicitações de http:// de System.Net.WebRequest classe. Para obter exemplos de extensão da classe para melhorar o desempenho, confira a página de referência XmlUrlResolver.

  • XmlSecureResolver ajuda a proteger outro objeto XmlResolver envolvendo o objeto e restringindo os recursos que ele pode acessar. Por exemplo, o XmlSecureResolver pode proibir o acesso a zonas ou sites específicos da Internet.

Você pode criar e especificar seu próprio resolvedor. Se você não especificar um resolvedor, o leitor usará um XmlUrlResolver padrão sem credenciais de usuário.

Você especifica XmlResolver para usar definindo a propriedade de XmlReaderSettings.XmlResolver e passando o objeto de XmlReaderSettings para o método de Create .

Se o recurso estiver armazenado em um sistema que exige autenticação, use a propriedade XmlResolver.Credentials para especificar as credenciais necessárias.

Fornecer credenciais de autenticação

O arquivo que contém os dados XML a serem lidos pode ter uma política de acesso restrito. Se a autenticação for necessária para acessar um recurso de rede, use a propriedade de Credentials para especificar as credenciais necessárias. Se a propriedade Credentials não for definida, as credenciais serão definidas como null.

Por exemplo, suponha que as credenciais sejam necessárias ao solicitar dados da Web para fins de autenticação. A menos que o diretório virtual da Web permita acesso anônimo, é necessário definir a propriedade Credentials para fornecer credenciais. O exemplo a seguir cria um objeto XmlReader que usa um XmlUrlResolver com credenciais padrão para acessar o site 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)

Você pode fornecer credenciais diferentes para URIs diferentes e adicioná-las a um cache. Essas credenciais são usadas para verificar a autenticação para o URIs diferente independentemente da fonte original XML. O exemplo a seguir mostra como adicionar credenciais a um cache.

// 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)

Considerações de segurança

Considere os seguintes itens ao trabalhar com a classe XmlResolver.

  • os objetos deXmlResolver podem conter informações sigilosas como credenciais do usuário. Você deve ter cuidado ao armazenar objetos XmlResolver em cache e não deve passar o objeto XmlResolver para um componente não confiável.

  • Se você estiver criando uma classe de propriedade que usa a classe de XmlResolver , a propriedade deve ser definida como uma propriedade somente de escrita. A propriedade pode ser usada para especificar XmlResolver para usar, mas não pode ser usada para retornar um objeto de XmlResolver .

  • Se o seu aplicativo aceitar objetos XmlResolver de um código não confiável, você não poderá presumir que o URI passado para o método GetEntity será o mesmo que o retornado pelo método ResolveUri. Classes derivadas de classes de XmlResolver podem substituir o método de GetEntity e os dados de retorno que são diferentes do que foi contido no URL original.

  • Seu aplicativo pode atenuar as ameaças de negação de memória do serviço para o método GetEntity implementando um IStream que limite o número de bytes lidos. Isso ajuda a proteger contra situações em que o código mal-intencionado tenta passar um fluxo infinito de bytes para o método GetEntity.