Condividi tramite


Classe XmlResolver

Questo articolo fornisce osservazioni supplementari alla documentazione di riferimento per questa API.

Il XmlResolver tipo viene usato per risolvere le risorse XML esterne, ad esempio entità, definizioni dei tipi di documento (DTD) o schemi. Viene usato anche per elaborare elementi di inclusione e importazione presenti nei fogli di stile XSL (Extensible Stylesheet Language) o negli schemi XSD (XML Schema Definition Language).

XmlResolver gestisce tutti gli aspetti della negoziazione della connessione alle risorse, inclusa la gestione delle credenziali di sicurezza, l'apertura della connessione all'origine dati e la restituzione della risorsa sotto forma di flusso o di un altro tipo di oggetto. L'oggetto che chiama XmlResolver ha l'attività di interpretare il flusso.

Lo System.Xml spazio dei nomi include due implementazioni concrete della XmlResolver classe :

  • XmlUrlResolver è il sistema di risoluzione predefinito per tutte le classi nello spazio dei System.Xml nomi . Supporta i protocolli file:// e http:// e le richieste dalla classe System.Net.WebRequest. Per esempi di estensione della classe per migliorare le prestazioni, vedere la XmlUrlResolver pagina di riferimento.

  • XmlSecureResolver consente di proteggere un altro XmlResolver oggetto eseguendo il wrapping dell'oggetto e limitando le risorse a cui può accedere. Ad esempio, XmlSecureResolver può impedire l'accesso a siti o zone Internet specifici.

È possibile creare e specificare un sistema di risoluzione personalizzato. Se non si specifica un sistema di risoluzione, il lettore usa un valore predefinito XmlUrlResolver senza credenziali utente.

È possibile specificare il tipo XmlResolver da utilizzare impostando la proprietà XmlReaderSettings.XmlResolver e passando l'oggetto XmlReaderSettings al metodo Create.

Se la risorsa viene archiviata in un sistema che richiede l'autenticazione, usare la XmlResolver.Credentials proprietà per specificare le credenziali necessarie.

Specificare le credenziali di autenticazione

Il file che contiene i dati XML da leggere può avere un criterio di accesso limitato. Se per accedere a una determinata risorsa di rete è necessaria l'autenticazione, utilizzare la proprietà Credentials per specificare le credenziali richieste. Se la Credentials proprietà non è impostata, le credenziali vengono impostate su null.

Si supponga, ad esempio, che le credenziali siano necessarie quando si richiedono dati dal Web a scopo di autenticazione. A meno che la directory virtuale Web non consenta l'accesso anonimo, è necessario impostare la Credentials proprietà per specificare le credenziali. Nell'esempio seguente viene creato un XmlReader oggetto che usa un XmlUrlResolver oggetto con credenziali predefinite per accedere al http://localhost/bookstore/inventory.xml sito.

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

È possibile specificare credenziali diverse per URI diversi e aggiungerle a una cache. Queste credenziali sono utilizzate per verificare l'autenticazione dei diversi URI, indipendentemente dall'origine dell'XML. Nell'esempio seguente viene illustrato come aggiungere credenziali a una 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)

Considerazioni sulla sicurezza

Quando si lavora con la XmlResolver classe , considerare gli elementi seguenti.

  • Gli oggetti XmlResolver possono contenere informazioni sensibili quali le credenziali utente. Prestare attenzione quando si memorizzano nella cache XmlResolver gli oggetti e non devono passare l'oggetto XmlResolver a un componente non attendibile.

  • Se si progetta una proprietà della classe in cui viene utilizzata la classe XmlResolver, è necessario definire tale proprietà come proprietà di sola scrittura. La proprietà può essere specificata in modo tale che venga utilizzata dal tipo XmlResolver, tuttavia non può essere utilizzata per restituire un oggetto XmlResolver.

  • Se l'applicazione accetta XmlResolver oggetti da codice non attendibile, non è possibile presupporre che l'URI passato nel GetEntity metodo sia uguale a quello restituito dal ResolveUri metodo . Le classi derivate dalla classe XmlResolver consentono di ignorare il metodo GetEntity e di restituire dati diversi da quelli contenuti nell'URI originale.

  • L'applicazione può ridurre le minacce denial of service alla memoria al GetEntity metodo implementando un oggetto IStream che limita il numero di byte letti. Ciò consente di evitare situazioni in cui il codice dannoso tenta di passare un flusso infinito di byte al GetEntity metodo .