通过


XmlUrlResolver 类

定义

解析由统一资源标识符(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 使用默认凭据的 XmlUrlResolver 凭据。


// 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 所有类的默认解析程序。 它支持 file://http:// 协议,并支持来自 WebRequest 类的请求。

重要

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 对象是使用 Default 枚举的成员 HttpRequestCacheLevel 创建的。

对象的 CachePolicy 属性 WebRequest 是使用对象设置的 HttpRequestCachePolicy

使用 XmlCachingResolver .. 创建 BooleanenableHttpCaching类的实例。 如果此值设置为 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 异步映射到包含实际资源的对象。

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)

适用于

另请参阅