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
- 繼承
範例
下列範例會 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) 或架構。 它也可用來處理可延伸樣式表單語言 (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 資料資源。 在某些情況下,解析快取中的資料資源可提高應用程式的效能,因為這樣會節省資料資源伺服器的往來成本。 這裡得到的效能必須針對最新內容的需求來加以考量。
下列範例會 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
實例是使用 建立的 Boolean
enableHttpCaching
。 當此值設定為 true
時,實例會盡可能從預設快取解析資源。 當 設定為 false
時 enableHttpCaching
,實例會使用預設行為,並從其來源解析資源。
注意
此範例會利用.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) |