Klasa XmlResolver
Ten artykuł zawiera dodatkowe uwagi dotyczące dokumentacji referencyjnej dla tego interfejsu API.
Typ służy do rozpoznawania XmlResolver zewnętrznych zasobów XML, takich jak jednostki, definicje typów dokumentów (DTD) lub schematy. Służy również do przetwarzania elementów dołączania i importowania elementów znajdujących się w arkuszach stylów extensible Stylesheet Language (XSL) lub schematach języka definicji schematu XML (XSD).
XmlResolver obsługuje wszystkie aspekty negocjowania połączenia z zasobami, w tym obsługę poświadczeń zabezpieczeń, otwieranie połączenia ze źródłem danych i zwracanie zasobu w postaci strumienia lub innego typu obiektu. Obiekt, który wywołuje XmlResolver , ma zadanie interpretowania strumienia.
System.Xml Przestrzeń nazw zawiera dwie konkretne implementacje XmlResolver klasy:
XmlUrlResolver to domyślny program rozpoznawania dla wszystkich klas w System.Xml przestrzeni nazw. Obsługuje
file://
on protokoły ihttp://
i żądania z System.Net.WebRequest klasy . Przykłady rozszerzania klasy w celu zwiększenia wydajności można znaleźć na stronie referencyjnej XmlUrlResolver .XmlSecureResolver Pomaga zabezpieczyć inny XmlResolver obiekt przez opakowywanie obiektu i ograniczanie zasobów, do których może uzyskać dostęp. Na przykład XmlSecureResolver program może uniemożliwić dostęp do określonych witryn internetowych lub stref.
Możesz utworzyć i określić własny program rozpoznawania nazw. Jeśli nie określisz programu rozpoznawania nazw, czytelnik używa wartości domyślnej XmlUrlResolver bez poświadczeń użytkownika.
Należy określić parametr XmlResolver do użycia, ustawiając XmlReaderSettings.XmlResolver właściwość i przekazując XmlReaderSettings obiekt do Create metody .
Jeśli zasób jest przechowywany w systemie, który wymaga uwierzytelniania, należy użyć XmlResolver.Credentials właściwości , aby określić niezbędne poświadczenia.
Podaj poświadczenia uwierzytelniania
Plik zawierający dane XML do odczytu może mieć zasady ograniczonego dostępu. Jeśli wymagane jest uwierzytelnienie w celu uzyskania dostępu do zasobu sieciowego, użyj Credentials właściwości , aby określić niezbędne poświadczenia. Jeśli właściwość nie jest ustawiona Credentials , poświadczenia są ustawione na null
wartość .
Załóżmy na przykład, że poświadczenia są potrzebne podczas żądania danych z Sieci Web do celów uwierzytelniania. Jeśli katalog wirtualny sieci Web nie zezwala na dostęp anonimowy, należy ustawić Credentials właściwość w celu podania poświadczeń. Poniższy przykład tworzy XmlReader obiekt, który używa obiektu XmlUrlResolver z domyślnymi poświadczeniami w celu uzyskania dostępu do http://localhost/bookstore/inventory.xml
witryny.
// 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)
Możesz podać różne poświadczenia dla różnych identyfikatorów URI i dodać je do pamięci podręcznej. Te poświadczenia służą do sprawdzania uwierzytelniania dla różnych identyfikatorów URI niezależnie od oryginalnego źródła XML. W poniższym przykładzie pokazano, jak dodać poświadczenia do pamięci podręcznej.
// 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)
Zagadnienia dotyczące zabezpieczeń
Podczas pracy z klasą XmlResolver należy wziąć pod uwagę następujące elementy.
XmlResolver obiekty mogą zawierać poufne informacje, takie jak poświadczenia użytkownika. Podczas buforowania XmlResolver obiektów należy zachować ostrożność i nie należy przekazywać XmlResolver obiektu do niezaufanego składnika.
Jeśli projektujesz właściwość klasy korzystającą z XmlResolver klasy, właściwość powinna być zdefiniowana jako właściwość tylko do zapisu. Właściwość może służyć do określania XmlResolver właściwości do użycia, ale nie można jej użyć do zwrócenia XmlResolver obiektu.
Jeśli aplikacja akceptuje XmlResolver obiekty z niezaufanego kodu, nie można założyć, że identyfikator URI przekazany do GetEntity metody będzie taki sam jak zwrócony przez metodę ResolveUri . Klasy pochodzące z XmlResolver klasy mogą zastąpić metodę GetEntity i zwracać dane inne niż zawarte w oryginalnym identyfikatorze URI.
Aplikacja może ograniczyć zagrożenia typu "odmowa usługi" pamięci do GetEntity metody, implementując element IStream , który ogranicza liczbę odczytanych bajtów. Pomaga to chronić przed sytuacjami, w których złośliwy kod próbuje przekazać nieskończony strumień bajtów do GetEntity metody.