Risoluzione di risorse XML esterne specificate da un URI

XmlResolver è una classe astratta che consente di risolvere le risorse XML esterne specificate da un URI. La classe XmlResolver viene utilizzata dalle seguenti classi:

  • XmlTextReader per caricare un documento XML e DTD esterni.
  • XmlValidatingReader per caricare un documento XML, DTD esterni, entità e schemi.
  • XmlDocument per caricare un documento XML, DTD esterni ed entità.
  • XmlSchema per elaborare elementi <xs:include> e <xs:import>.
  • XmlSchemaCollection per elaborare elementi <xs:include> e <xs:import>.
  • XslTransform per caricare il foglio di stile, elaborare elementi <xsl:include> o <xsl:import> presenti nel foglio di stile e risolvere eventuali funzioni document() presenti nel foglio di stile.

La classe XmlResolver consente di agevolare la risoluzione delle risorse XML provenienti da origini di dati arbitrarie come i file system e i server Web. Le implementazioni concrete di XmlResolver consentono di gestire tutti gli aspetti della negoziazione della connessione per le risorse, inclusa la gestione delle credenziali di protezione, l'apertura della connessione all'origine dati e la restituzione della risorsa sotto forma di flusso o di un altro tipo si oggetto.

La classe XmlUrlResolver è un'implementazione concreta di XmlResolver per gli URL Questa classe agevola la risoluzione delle risorse XML tramite i protocolli file://, http:// e https://.

La classe XmlSecureResolver, implementata in .NET Framework versione 1.1, è un'altra implementazione concreata di XmlResolver. XmlSecureResolver viene utilizzata includere qualsiasi implementazione concreta di XmlResolver e consente di limitare le risorse a cui ha accesso la classe XmlResolver sottostante attraverso le autorizzazioni di protezione. XmlSecureResolver, ad esempio, può impedire il reindirizzamento tra domini, che può verificarsi da un riferimento a un URI incorporato.

La classe derivata XmlSecureResolver consente di impostare un PermissionSet per permettere soltanto l'accesso alle risorse desiderate. Impostando le autorizzazioni di protezione appropriate, la classe XmlResolver sottostante non è in grado di accedere alle risorse che non soddisfano il modello di protezione di .NET.

In .NET Framework versione 1.1 XmlSecureResolver dispone di tre costruttori con overload. Il primo accetta XmlResolver ed Evidence come argomenti, mentre il secondo metodo accetta XmlResolver e PermissionSet come argomenti. Il terzo accetta invece XmlResolver e una stringa URI.

Quando si utilizza un metodo senza un argomento PermissionSet, viene utilizzata la prova o l'URI per calcolare il valore di PermissionSet e creare un'asserzione nella classe XmlResolver sottostante. Se si conosce quale valore di PermissionSet dare per XmlSecureResolver o si desidera ottenere una versione di PermissionSet più personalizzata, utilizzare il terzo metodo con overload che consente di creare direttamente un'asserzione del valore dato di PermissionSet nella classe XmlResolver sottostante. Per ulteriori informazioni sui metodi con overload di XmlSecureResolver, vedere Costruttore XmlSecureResolver.

Individuazione dell'URI assoluto di una risorsa XML

Se si dispone di un URI relativo e di un URI di base, è possibile chiamare il metodo ResolveUri della classe XmlResolver per ottenere l'URI assoluto della risorsa. Per utilizzare questo metodo, chiamare il metodo XmlResolver.ResolveUri specificando l'URI di base e quello da risolvere. Verrà restituito un URI assoluto, che consentirà di chiamare il metodo GetEntity della classe XmlResolver per accedere alla risorsa identificata dall'URI. Il metodo GetEntity utilizza l'URI assoluto per individuare e restituire un oggetto flusso per la risorsa.

Utilizzo del sistema di risoluzione per individuare le risorse utilizzate da un metodo Transform e dalla classe XslTransform

Se un foglio di stile XSLT include un tag <xsl:import> o <xsl:include> oppure una funzione document(), viene utilizzata un'implementazione di XmlResolver per individuare la risorsa esterna.

XslTransform xslt = new XslTransform();
xslt.Load("http://webdata/global/xmlweb.xsl", new XmlUrlResolver());

Durante la compilazione del foglio di stile xmlweb.xsl, XslTransform rileva un elemento include come indicato di seguito:

<xsl:include href="managed.xsl"/">

Pertanto XslTransform chiama

Uri fulluri = this.XmlResolver.ResolveUri("http://webdata/global/xmlweb.xsl",
                                    "managed.xsl");
if (fulluri != null) {
    Stream s = (Stream)this.XmlResolver.GetEntity(fulluri, null,
                                                 typeof(Stream));
}

Il codice sopra riportato restituisce un nuovo flusso, che verrà incluso in un XmlTextReader. L'operazione continua con la compilazione del foglio di stile incluso. Si noti che la classe XslTransform passa avanti l'istanza di XmlResolver ricevuta precedentemente nel metodo Load per consentire la risoluzione delle risorse con gli stessi privilegi di protezione da parte di XmlTextReader.

[C#]

XmlTextReader reader = new XmlTextReader(s, fulluri);
reader.XmlResolver = this.XmlResolver;
while (reader.Read()) 
{ . . .}

In .NET Framework versione 1.1, se si desidera impedire il reindirizzamento tra aree di protezione o l'accesso a determinati fogli di stile XSLT che si trovano in un certo URI, è possibile impostare i criteri di protezione del computer in modo appropriato e specificare XmlSecureResolver nei metodi Load e Transform della classe XslTransform. In .NET Framework versione 1.0, non è invece possibile evitare il controllo del reindirizzamento tra aree di protezione e tra domini. Pertanto qualsiasi URI incorporato che implichi il reindirizzamento a causa di elementi include e import, di riferimenti a entità esterne e così via, leggerà i dati senza verificare la protezione dei dati stessi o del sito. Questo accade perché, quando si verifica il reindirizzamento, non vengono passate le credenziali e pertanto il foglio di stile potrebbe risultare danneggiato da dati provenienti da un sito non protetto o anonimo.

Vedere anche

Risoluzione delle risorse mediante XmlResolver | Implementazione delle credenziali di autenticazione in XmlResolver quando si esegue la lettura da un file | Creazione di un risolutore personalizzato