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
- 繼承
範例
下列範例會建立使用具有預設認證的 XmlUrlResolverXmlReader。
// 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 對象的網路 Proxy。 |
方法
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。 |
ResolveUri(Uri, String) |
在衍生類別中覆寫時,從基底和相對 URI 解析絕對 URI。 (繼承來源 XmlResolver) |
SupportsType(Uri, Type) |
可讓解析程式傳回 Stream以外的類型。 (繼承來源 XmlResolver) |
ToString() |
傳回表示目前 物件的字串。 (繼承來源 Object) |