Condividi tramite


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 nomi System.Xml. Supporta i file:// protocolli e http:// e le richieste dalla System.Net.WebRequest classe . 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.

Specificare l'oggetto XmlResolver da utilizzare impostando la XmlReaderSettings.XmlResolver proprietà e passando l'oggetto XmlReaderSettings al Create metodo .

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 l'autenticazione è necessaria per accedere a una risorsa di rete, usare la Credentials proprietà per specificare le credenziali necessarie. 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 vengono usate per controllare l'autenticazione per i diversi URI indipendentemente dall'origine originale del codice 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.

  • XmlResolver oggetti possono contenere informazioni riservate, ad esempio credenziali utente. Si dovrebbe fare attenzione quando si memorizzano nella cache gli oggetti XmlResolver e non si dovrebbe passare l'oggetto XmlResolver a un componente non attendibile.

  • Se si progetta una proprietà di classe che utilizza la XmlResolver classe , la proprietà deve essere definita come proprietà di sola scrittura. La proprietà può essere utilizzata per specificare l'oggetto XmlResolver da utilizzare, ma non può essere utilizzato per restituire un XmlResolver oggetto .

  • 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 possono eseguire l'override XmlResolver del GetEntity metodo e restituire dati diversi da quelli contenuti nell'URI originale.

  • L'applicazione può mitigare le minacce di denial of service alla memoria al metodo GetEntity implementando un 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 .