XmlResolver 類別
本文提供此 API 參考文件的補充備註。
此 XmlResolver 類型可用來解析外部 XML 資源,例如實體、檔類型定義 (DTDs) 或架構。 它也可用來處理可延伸樣式表單語言 (XSL) 樣式表單或 XML 架構定義語言 (XSD) 架構中找到的包含和匯入專案。
XmlResolver 處理與資源連接交涉的所有層面,包括處理安全性認證、開啟數據源的連接,以及以數據流或其他物件類型的形式傳回資源。 呼叫 XmlResolver 的物件具有解譯數據流的工作。
命名空間 System.Xml 包含 類別的兩個具體實作 XmlResolver :
XmlUrlResolver 是命名空間中 System.Xml 所有類別的預設解析程式。 它支援
file://
及http://
通訊協定,以及 System.Net.WebRequest 類別的要求。 如需擴充 類別以改善效能的範例,請參閱 XmlUrlResolver 參考頁面。XmlSecureResolver 藉由包裝物件並限制其可存取的資源,協助保護另一個 XmlResolver 物件。 例如, XmlSecureResolver 可以禁止存取特定因特網網站或區域。
您可以建立並指定自己的解析程式。 如果您未指定解析程式,讀取器會使用沒有使用者認證的預設值 XmlUrlResolver 。
藉由設定 XmlResolver 屬性並將 XmlReaderSettings.XmlResolver 物件傳遞至 XmlReaderSettings 方法,可以指定要使用的 Create。
如果資源儲存在需要驗證的系統上,您可以使用 XmlResolver.Credentials 屬性來指定必要的認證。
提供驗證認證
包含要讀取之 XML 資料的檔案可能會有限制的存取原則。 如果需要驗證才可存取網路資源,請使用 Credentials 屬性指定必要的認證。 Credentials如果未設定 屬性,認證會設定為 null
。
例如,假設從 Web 要求數據以進行驗證時需要認證。 除非 Web 虛擬目錄允許匿名存取,否則您必須設定 Credentials 屬性以提供認證。 下列範例會建立物件 XmlReader ,其使用 XmlUrlResolver 具有默認認證的 來存取 http://localhost/bookstore/inventory.xml
網站。
// 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)
您可以針對不同的 URI 提供不同的認證,並將其新增至快取。 不論 XML 的原始來源為何,這些認證都會用於檢查不同 URI 的驗證。 下列範例示範如何將認證新增至快取。
// 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)
安全性考量
使用 類別時, XmlResolver 請考慮下列專案。
XmlResolver 物件可以包含機密資訊 (如使用者認證)。 快取 XmlResolver 物件時,您應該小心,不應該將 XmlResolver 對象傳遞至不受信任的元件。
如果設計使用 XmlResolver 類別的類別屬性,應將屬性定義為唯寫屬性。 該屬性可用於指定要使用的 XmlResolver,但其不可用於傳回 XmlResolver 物件。
如果您的應用程式接受 XmlResolver 來自不受信任程式碼的物件,則無法假設傳入方法的 GetEntity URI 會與方法所 ResolveUri 傳回的 URI 相同。 從 XmlResolver 類別衍生的類別可以覆寫 GetEntity 方法,並傳回與原始 URI 所包含之內容不同的資料。
您的應用程式可以藉由實作 限制讀取位元元組數目的 來IStream減輕方法的記憶體阻斷服務威脅GetEntity。 這有助於防範惡意代碼嘗試將無限位元組數據流傳遞至 GetEntity 方法的情況。