XmlResolver

本文提供了此 API 参考文档的补充说明。

XmlResolver 类型用于解析外部 XML 资源,例如实体、文档类型定义 (DTD) 或架构。 它还用于处理在可扩展样式表语言 (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 提供不同的凭据,并将其添加到缓存中。 这些凭据用于检查不同 URI 的身份验证,与 XML 的原始源无关。 以下示例演示如何将凭据添加到缓存中。

// 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 方法。