XmlResolver-Klasse

Dieser Artikel enthält ergänzende Hinweise zur Referenzdokumentation für diese API.

Der Typ XmlResolver wird verwendet, um externe XML-Ressourcen wie Entitäten, Dokumenttypdefinitionen (DTDs) oder Schemas aufzulösen. Er wird auch verwendet, um Elemente einzuschließen und zu importieren, die in XSL-Stylesheets (Extensible Stylesheet Language) oder Schemas für die XML-Schemadefinitionssprache (XSD) gefunden wurden.

XmlResolver behandelt alle Aspekte beim Aushandeln der Verbindung mit den Ressourcen. Dazu gehören die Behandlung von Sicherheitseinstellungen, das Öffnen der Verbindung mit der Datenquelle und das Zurückgeben der Ressource als Stream oder als anderer Objekttyp. Das Objekt, das XmlResolver aufruft, hat die Aufgabe, den Datenstrom zu interpretieren.

Im System.Xml-Namespace sind zwei konkrete Implementierungen der XmlResolver-Klasse enthalten:

  • XmlUrlResolver wird als Standard zum Auflösen für alle Klassen im System.Xml-Namespace verwendet. Sie unterstützt das file://-Protokoll und das http://-Protokoll und Anforderungen von der System.Net.WebRequest-Klasse. Beispiele zum Erweitern der Klasse zur Verbesserung der Leistung finden Sie auf der XmlUrlResolver-Referenzseite.

  • XmlSecureResolver trägt zum Schutz eines anderen XmlResolver-Objekts bei. Dazu wird das Objekt umschlossen, und die Ressourcen, auf die es zugreifen kann, werden eingeschränkt. Beispielsweise kann XmlSecureResolver den Zugriff auf bestimmte Internetsites oder -zonen verhindern.

Sie können einen eigenen Resolver erstellen und angeben. Wenn Sie keinen Resolver angeben, verwendet der Reader eine XmlUrlResolver-Standardklasse ohne Benutzeranmeldeinformationen.

Sie geben den zu verwendenden XmlResolver an, indem Sie die XmlReaderSettings.XmlResolver-Eigenschaft festlegen und das XmlReaderSettings-Objekt an die Create-Methode übergeben.

Wenn die Ressource in einem System gespeichert ist, für das eine Authentifizierung erforderlich ist, können mit der XmlResolver.Credentials-Eigenschaft die erforderlichen Anmeldeinformationen angegeben werden.

Angeben der Anmeldeinformationen für die Authentifizierung

Für die Datei, die die zu lesenden XML-Daten enthält, gilt möglicherweise eine Richtlinie für eingeschränkten Zugriff. Wenn für den Zugriff auf eine Netzwerkressource eine Authentifizierung erforderlich ist, geben Sie die erforderlichen Anmeldeinformationen mithilfe der Credentials-Eigenschaft an. Wenn die Credentials-Eigenschaft nicht festgelegt ist, werden die Anmeldeinformationen auf null festgelegt.

Angenommen, beim Anfordern von Daten aus dem Internet sind Anmeldeinformationen für die Authentifizierung erforderlich. Sofern das virtuelle Webverzeichnis anonymen Zugriff zulässt, müssen Sie die Credentials-Eigenschaft so festlegen, dass Anmeldeinformationen angegeben werden. Im folgenden Beispiel wird ein XmlReader-Objekt erstellt, das XmlUrlResolver mit Standardanmeldeinformationen für den Zugriff auf die Website http://localhost/bookstore/inventory.xml verwendet.

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

Sie können unterschiedliche Anmeldeinformationen für verschiedene URIs angeben und zu einem Cache hinzufügen. Anhand dieser Anmeldeinformationen wird die Authentifizierung für die unterschiedlichen URIs überprüft, ungeachtet der ursprünglichen Quelle des XML-Codes. Im folgenden Beispiel wird veranschaulicht, wie Anmeldeinformationen einem Cache hinzugefügt werden:

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

Sicherheitshinweise

Bei Verwendung der XmlResolver-Klasse müssen die folgenden Aspekte berücksichtigt werden:

  • XmlResolver-Objekte können vertrauliche Informationen (z. B. Anmeldeinformationen des Benutzers) enthalten. Sie sollten beim Zwischenspeichern von XmlResolver-Objekten darauf achten, dass das XmlResolver-Objekt nicht an eine nicht vertrauenswürdige Komponente übergeben wird.

  • Wenn Sie eine Klasseneigenschaft entwerfen, die die XmlResolver-Klasse verwendet, sollte die Eigenschaft als eine Nur-Schreiben-Eigenschaft (d. h. als lesegeschützt) definiert sein. Mithilfe der Eigenschaft können Sie den zu verwendenden XmlResolver angeben. Sie können die Eigenschaft jedoch nicht zur Rückgabe eines XmlResolver-Objekts verwenden.

  • Wenn Ihre Anwendung XmlResolver-Objekte von nicht vertrauenswürdigem Code akzeptiert, können Sie nicht davon ausgehen, dass der an die GetEntity-Methode übergebene URI identisch mit dem URI ist, der von der ResolveUri-Methode zurückgegeben wird. Von der XmlResolver-Klasse abgeleitete Klassen können die GetEntity-Methode überschreiben und Daten zurückgeben, die sich von den Daten unterscheiden, die im ursprünglichen URI enthalten waren.

  • Ihre Anwendung kann das Risiko von Speicher-DoS-Angriffen (Denial of Service) auf die GetEntity-Methode mindern. Dies erfolgt durch die Implementierung einer IStream-Schnittstelle, die die Anzahl der gelesenen Bytes begrenzt. Dies stellt einen Schutz für Situationen dar, in denen bösartiger Code versucht, einen unbegrenzten Bytedatenstrom an die GetEntity-Methode zu übergeben.