XmlUrlResolver 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
解析由统一资源标识符(URI)命名的外部 XML 资源。
public ref class XmlUrlResolver : System::Xml::XmlResolver
public class XmlUrlResolver : System.Xml.XmlResolver
type XmlUrlResolver = class
inherit XmlResolver
Public Class XmlUrlResolver
Inherits XmlResolver
- 继承
示例
以下示例创建一个使用具有默认凭据的 XmlUrlResolver 的 XmlReader。
// Create an XmlUrlResolver with default credentials.
XmlUrlResolver resolver = new XmlUrlResolver();
resolver.Credentials = CredentialCache.DefaultCredentials;
// Create the reader.
XmlReaderSettings settings = new XmlReaderSettings();
settings.XmlResolver = resolver;
XmlReader reader =
XmlReader.Create("http://serverName/data/books.xml", settings);
' Create an XmlUrlResolver with default credentials.
Dim resolver As New XmlUrlResolver()
resolver.Credentials = CredentialCache.DefaultCredentials
' Create the reader.
Dim settings As New XmlReaderSettings()
settings.XmlResolver = resolver
Dim reader As XmlReader = _
XmlReader.Create("http://serverName/data/books.xml", settings)
注解
XmlUrlResolver 用于解析外部 XML 资源,例如实体、文档类型定义(DTD)或架构。 它还用于处理在可扩展 StyleSheet 语言(XSL)样式表或 XML 架构定义语言(XSD)架构中找到的包含和导入元素。
XmlUrlResolver 是 System.Xml 命名空间中所有类的默认解析程序。 它支持来自 WebRequest 类的 file://
和 http://
协议和请求。
重要
XmlUrlResolver 对象可以包含敏感信息,例如用户凭据。 缓存 XmlUrlResolver 对象时,应小心,不应将 XmlUrlResolver 对象传递给不受信任的组件。
解析 DTD
如果 XML 读取器(XmlReader)正在读取包含外部 DTD 的 XML 文件,它将调用 XmlUrlResolver.GetEntityAsync 方法以获取 DTD 的流表示形式。 如果 DTD 的 URI 是相对 URI,则 XML 读取器将调用 XmlUrlResolver.ResolveUri 方法,并返回给定 relativeUri
和 baseURi
参数的绝对 URI。 如果 XmlUrlResolver 不知道如何解析 URI,它将返回 null
。
XmlUrlResolver.GetEntity 方法根据情况使用 Credentials 属性中的信息来获取对资源的访问权限。 出于安全原因,此属性没有 get
访问器。 覆盖 XmlResolver时,GetEntity 是利用 Credentials 属性中的凭据信息的方法。
解析所有其他 XML 资源与解析 DTD 非常相似。 XmlResolver 与外部资源协商连接,并返回内容的 Stream 表示形式。 调用 XmlResolver 的对象解释流。
扩展 XmlUrlResolver 类
XmlUrlResolver 类的默认行为是从其源而不是缓存解析 XML 数据资源。 在某些情况下,通过缓存解析数据资源可以通过保存数据资源的服务器来改善应用程序的性能。 此处的性能提升必须根据 up-to日期内容的需求进行权衡。
以下示例扩展 XmlUrlResolver 并生成一个新类(XmlCachingResolver
)以从缓存中检索资源。 这是通过重写 XmlUrlResolver.Credentials 属性和 XmlUrlResolver.GetEntity 方法来完成的。
class XmlCachingResolver : XmlUrlResolver
{
bool enableHttpCaching;
ICredentials credentials;
//resolve resources from cache (if possible) when enableHttpCaching is set to true
//resolve resources from source when enableHttpcaching is set to false
public XmlCachingResolver(bool enableHttpCaching)
{
this.enableHttpCaching = enableHttpCaching;
}
public override ICredentials Credentials
{
set
{
credentials = value;
base.Credentials = value;
}
}
public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
{
if (absoluteUri == null)
{
throw new ArgumentNullException("absoluteUri");
}
//resolve resources from cache (if possible)
if (absoluteUri.Scheme == "http" && enableHttpCaching && (ofObjectToReturn == null || ofObjectToReturn == typeof(Stream)))
{
WebRequest webReq = WebRequest.Create(absoluteUri);
webReq.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.Default);
if (credentials != null)
{
webReq.Credentials = credentials;
}
WebResponse resp = webReq.GetResponse();
return resp.GetResponseStream();
}
//otherwise use the default behavior of the XmlUrlResolver class (resolve resources from source)
else
{
return base.GetEntity(absoluteUri, role, ofObjectToReturn);
}
}
}
Class XmlCachingResolver
Inherits XmlUrlResolver
Dim enableHttpCaching As Boolean
Public Shadows Credentials As ICredentials
'resolve resources from cache (if possible) when enableHttpCaching is set to true
'resolve resources from source when enableHttpcaching is set to false
Public Sub New(ByVal enableHttpCaching As Boolean)
Me.enableHttpCaching = enableHttpCaching
End Sub
Public Shadows Function GetEntity(ByVal absoluteUri As Uri, ByVal role As String, ByVal returnType As Type) As Object
If absoluteUri = Nothing Then
Throw New ArgumentNullException("absoluteUri")
End If
'resolve resources from cache (if possible)
If absoluteUri.Scheme = "http" And enableHttpCaching And (returnType Is GetType(Nullable) Or returnType Is GetType(Stream)) Then
Dim webReq As WebRequest = WebRequest.Create(absoluteUri)
webReq.CachePolicy = New HttpRequestCachePolicy(HttpRequestCacheLevel.Default)
If Not (Credentials Is Nothing) Then
webReq.Credentials = Credentials
End If
Dim resp As WebResponse = webReq.GetResponse()
Return resp.GetResponseStream()
'otherwise use the default behavior of the XmlUrlResolver class (resolve resources from source)
Else
Return MyBase.GetEntity(absoluteUri, role, returnType)
End If
End Function
End Class
XmlCachingResolver
类的缓存行为在 GetEntity
方法中实现。 这是通过创建新的 WebRequest 和 HttpRequestCachePolicy 对象来完成的。
HttpRequestCachePolicy 对象是使用 HttpRequestCacheLevel 枚举 Default 成员创建的。
WebRequest 对象的 CachePolicy 属性是使用 HttpRequestCachePolicy 对象设置的。
使用 Boolean
enableHttpCaching
创建 XmlCachingResolver
类的实例。 如果此值设置为 true
,则实例会尽可能从默认缓存解析资源。 当 enableHttpCaching
设置为 false
时,实例使用默认行为并从其源解析资源。
注意
此示例利用 .NET Framework 中 XML 类的扩展性。 可以扩展和自定义其他类,以满足特定应用程序的需求。
构造函数
XmlUrlResolver() |
初始化 XmlUrlResolver 类的新实例。 |
属性
CachePolicy |
获取或设置基础 WebRequest 对象的缓存策略。 |
Credentials |
设置用于对 Web 请求进行身份验证的凭据。 |
Proxy |
获取或设置基础 WebRequest 对象的网络代理。 |
方法
Equals(Object) |
确定指定的对象是否等于当前对象。 (继承自 Object) |
GetEntity(Uri, String, Type) |
将 URI 映射到包含实际资源的对象。 |
GetEntityAsync(Uri, String, Type) |
将 URI 异步映射到包含实际资源的对象。 |
GetEntityAsync(Uri, String, Type) |
将 URI 异步映射到包含实际资源的对象。 (继承自 XmlResolver) |
GetHashCode() |
用作默认哈希函数。 (继承自 Object) |
GetType() |
获取当前实例的 Type。 (继承自 Object) |
MemberwiseClone() |
创建当前 Object的浅表副本。 (继承自 Object) |
ResolveUri(Uri, String) |
从基 URI 和相对 URI 解析绝对 URI。 |
ResolveUri(Uri, String) |
在派生类中重写时,从基 URI 和相对 URI 解析绝对 URI。 (继承自 XmlResolver) |
SupportsType(Uri, Type) |
使解析程序能够返回除 Stream以外的类型。 (继承自 XmlResolver) |
ToString() |
返回一个表示当前对象的字符串。 (继承自 Object) |