Share via


XmlResolver 類別

本文提供此 API 參考文件的補充備註。

XmlResolver 類型可用來解析外部 XML 資源,例如實體、檔類型定義 (DTDs) 或架構。 它也可用來處理可延伸樣式表單語言 (XSL) 樣式表單或 XML 架構定義語言 (XSD) 架構中找到的包含和匯入專案。

XmlResolver 處理與資源連接交涉的所有層面,包括處理安全性認證、開啟數據源的連接,以及以數據流或其他物件類型的形式傳回資源。 呼叫 XmlResolver 的物件具有解譯數據流的工作。

命名空間 System.Xml 包含 類別的兩個具體實作 XmlResolver

您可以建立並指定自己的解析程式。 如果您未指定解析程式,讀取器會使用沒有使用者認證的預設值 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 方法的情況。