Compartilhar via


Este artigo fornece comentários complementares à documentação de referência para esta API.

O XmlResolver tipo é usado para resolver recursos XML externos, como entidades, DTDs (definições de tipo de documento) ou esquemas. Ele também é usado para processar elementos de inclusão e importação encontrados em folhas de estilo XSL (Extensible Stylesheet Language) ou esquemas XSD (linguagem de definição de esquema XML).

XmlResolver manipula 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 System.Xml namespace inclui duas implementações concretas da XmlResolver classe:

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

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

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

Especifique o XmlResolver a ser usado definindo a propriedade XmlReaderSettings.XmlResolver e passando o objeto XmlReaderSettings no método Create.

Se o recurso for armazenado em um sistema que requer autenticação, use a XmlResolver.Credentials propriedade 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 Credentials propriedade para especificar as credenciais necessárias. Se a Credentials propriedade não estiver 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, você deve definir a Credentials propriedade 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 das diferentes URIs, independentemente da origem original do 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 itens a seguir ao trabalhar com a XmlResolver classe.

  • XmlResolver os objetos podem conter informações confidenciais, como credenciais de usuário. Você deve ter cuidado ao armazenar objetos em cache XmlResolver e não deve passar o XmlResolver objeto 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 o uso do XmlResolver, mas não pode ser usada para retornar um objeto XmlResolver.

  • Se o aplicativo aceitar XmlResolver objetos de código não confiável, você não poderá assumir que o URI passado para o GetEntity método será o mesmo que o retornado pelo ResolveUri método. Classes derivadas da XmlResolver classe podem substituir o GetEntity método e retornar dados diferentes dos contidos no URI original.

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