VirtualPathProvider Třída
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Poskytuje sadu metod, které webové aplikaci umožňují načítat prostředky z virtuálního systému souborů.
public ref class VirtualPathProvider abstract : MarshalByRefObject
public abstract class VirtualPathProvider : MarshalByRefObject
type VirtualPathProvider = class
inherit MarshalByRefObject
Public MustInherit Class VirtualPathProvider
Inherits MarshalByRefObject
- Dědičnost
Příklady
Následující příklad kódu je VirtualPathProvider implementace třídy, která vytvoří virtuální systém souborů pomocí informací uložených v objektu DataSet . Příklad kódu funguje s příklady kódu pro VirtualFile třídy a VirtualDirectory poskytuje virtuální prostředky z úložiště dat načteného do objektu DataSet .
Tento příklad má čtyři části: implementace třídy VirtualPathProvider, datový soubor XML použitý k naplnění objektu DataSet, objekt AppStart obsahující metodu AppInitialize sloužící k registraci třídy VirtualPathProvider v systému kompilace a ASP.NET stránce, která poskytuje odkazy na virtuální soubory.
Pokud chcete tento ukázkový kód použít v aplikaci, postupujte takto.
Vytvořte na webovém serveru ukázkovou aplikaci.
Zkopírujte zdrojový kód vlastního objektu VirtualPathProvider (viz níže) do souboru v adresáři aplikace
App_Code.Zkopírujte zdrojový kód pro vlastní VirtualDirectory objekt (viz část Příklad v tématu přehledu VirtualDirectory třídy) do souboru v adresáři aplikace
App_Code.Zkopírujte zdrojový kód pro vlastní VirtualFile objekt (viz část Příklad v tématu přehledu VirtualFile třídy) do souboru v adresáři aplikace
App_Code.Zkopírujte zdrojový kód objektu
AppStart(viz níže) do souboru v adresáři aplikaceApp_Code.Zkopírujte data XML (viz níže) do souboru s názvem
XMLData.xmldo souboru v adresáři aplikaceApp_Data.default.aspxZkopírujte soubor (viz níže) do kořenového adresáře ukázkové aplikace. Otevřete soubor pomocí webového prohlížečedefault.aspxa kliknutím na odkazy na stránce zobrazte obsah virtuálních souborů.
První příklad je vlastní VirtualPathProvider třída. Metody DirectoryExists jsou FileExists přepsány, aby indikovaly, zda je požadovaný adresář v systému virtuálních souborů. Metody GetDirectory a GetFile metody se přepíše tak, aby vrátily vlastní VirtualDirectory instance a VirtualFile instance obsahující informace z virtuálního systému souborů.
Třída také poskytuje metodu GetVirtualData používanou třídami VirtualDirectoryVirtualFile pro přístup k objektu DataSet obsahujícímu data virtuálního systému souborů. V produkční implementaci by se tato metoda obvykle implementovala v obchodním objektu zodpovědném za interakci s úložištěm dat.
using System;
using System.Data;
using System.Security.Permissions;
using System.Web;
using System.Web.Caching;
using System.Web.Hosting;
namespace Samples.AspNet.CS
{
[AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Medium)]
[AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.High)]
public class SamplePathProvider : VirtualPathProvider
{
private string dataFile;
public SamplePathProvider()
: base()
{
}
protected override void Initialize()
{
// Set the datafile path relative to the application's path.
dataFile = HostingEnvironment.ApplicationPhysicalPath + "App_Data\\XMLData.xml";
}
/// <summary>
/// Data set provider for the SampleVirtualDirectory and
/// SampleVirtualFile classes. In a production application
/// this method would be on a provider class that accesses
/// the virtual resource data source.
/// </summary>
/// <returns>
/// The System.Data.DataSet containing the virtual resources
/// provided by the SamplePathProvider.
/// </returns>
public DataSet GetVirtualData()
{
// Get the data from the cache.
DataSet ds = (DataSet)HostingEnvironment.Cache.Get("VPPData");
if (ds == null)
{
// Data not in cache. Read XML file.
ds = new DataSet();
ds.ReadXml(dataFile);
// Make DataSet dependent on XML file.
CacheDependency cd = new CacheDependency(dataFile);
// Put DataSet into cache for maximum of 20 minutes.
HostingEnvironment.Cache.Add("VPPData", ds, cd,
Cache.NoAbsoluteExpiration,
new TimeSpan(0, 20, 0),
CacheItemPriority.Default, null);
// Set data timestamp.
DateTime dataTimeStamp = DateTime.Now;
// Cache it so we can get the timestamp in later calls.
HostingEnvironment.Cache.Insert("dataTimeStamp", dataTimeStamp, null,
Cache.NoAbsoluteExpiration,
new TimeSpan(0, 20, 0),
CacheItemPriority.Default, null);
}
return ds;
}
/// <summary>
/// Determines whether a specified virtual path is within
/// the virtual file system.
/// </summary>
/// <param name="virtualPath">An absolute virtual path.</param>
/// <returns>
/// true if the virtual path is within the
/// virtual file sytem; otherwise, false.
/// </returns>
private bool IsPathVirtual(string virtualPath)
{
String checkPath = VirtualPathUtility.ToAppRelative(virtualPath);
return checkPath.StartsWith("~/vrdir", StringComparison.InvariantCultureIgnoreCase);
}
public override bool FileExists(string virtualPath)
{
if (IsPathVirtual(virtualPath))
{
SampleVirtualFile file = (SampleVirtualFile)GetFile(virtualPath);
return file.Exists;
}
else
{
return Previous.FileExists(virtualPath);
}
}
public override bool DirectoryExists(string virtualDir)
{
if (IsPathVirtual(virtualDir))
{
SampleVirtualDirectory dir = (SampleVirtualDirectory)GetDirectory(virtualDir);
return dir.Exists;
}
else
{
return Previous.DirectoryExists(virtualDir);
}
}
public override VirtualFile GetFile(string virtualPath)
{
if (IsPathVirtual(virtualPath))
return new SampleVirtualFile(virtualPath, this);
else
return Previous.GetFile(virtualPath);
}
public override VirtualDirectory GetDirectory(string virtualDir)
{
if (IsPathVirtual(virtualDir))
return new SampleVirtualDirectory(virtualDir, this);
else
return Previous.GetDirectory(virtualDir);
}
public override CacheDependency GetCacheDependency(
string virtualPath,
System.Collections.IEnumerable virtualPathDependencies,
DateTime utcStart)
{
if (IsPathVirtual(virtualPath))
{
System.Collections.Specialized.StringCollection fullPathDependencies = null;
// Get the full path to all dependencies.
foreach (string virtualDependency in virtualPathDependencies)
{
if (fullPathDependencies == null)
fullPathDependencies = new System.Collections.Specialized.StringCollection();
fullPathDependencies.Add(virtualDependency);
}
if (fullPathDependencies == null)
return null;
// Copy the list of full-path dependencies into an array.
string[] fullPathDependenciesArray = new string[fullPathDependencies.Count];
fullPathDependencies.CopyTo(fullPathDependenciesArray, 0);
// Copy the virtual path into an array.
string[] virtualPathArray = new string[1];
virtualPathArray[0] = virtualPath;
return new CacheDependency(virtualPathArray, fullPathDependenciesArray, utcStart);
}
else
{
return Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
}
}
}
}
Imports System.Data
Imports System.Security.Permissions
Imports System.Web
Imports System.Web.Caching
Imports System.Web.Hosting
Namespace Samples.AspNet.VB
<AspNetHostingPermission(SecurityAction.Demand, Level:=AspNetHostingPermissionLevel.Medium), _
AspNetHostingPermission(SecurityAction.InheritanceDemand, level:=AspNetHostingPermissionLevel.High)> _
Public Class SamplePathProvider
Inherits VirtualPathProvider
Private dataFile As String
Public Sub New()
MyBase.New()
End Sub
Protected Overrides Sub Initialize()
' Set the datafile path relative to the application's path.
dataFile = HostingEnvironment.ApplicationPhysicalPath & _
"App_Data\XMLData.xml"
End Sub
' Data set provider for the SampleVirtualFile and
' SampleVirtualDirectory classes. In a production application
' this method would be on a provider class that accesses
' the virtual resource data source.
' The System.Data.DataSet containing the virtual resources
' provided by the SamplePathProvider.
Public Function GetVirtualData() As DataSet
' Get the data from the cache.
Dim ds As DataSet
ds = CType(HostingEnvironment.Cache.Get("VPPData"), DataSet)
If ds Is Nothing Then
' Data set not in cache. Read XML file.
ds = New DataSet
ds.ReadXml(dataFile)
' Make DataSet dependent on XML file.
Dim cd As CacheDependency
cd = New CacheDependency(dataFile)
' Put DataSet into cache for maximum of 20 minutes.
HostingEnvironment.Cache.Add("VPPData", ds, cd, _
Cache.NoAbsoluteExpiration, _
New TimeSpan(0, 20, 0), _
CacheItemPriority.Default, Nothing)
' Set data timestamp.
Dim dataTimeStamp As DateTime
dataTimeStamp = DateTime.Now
' Cache it so we can get the timestamp in later calls.
HostingEnvironment.Cache.Add("dataTimeStamp", dataTimeStamp, Nothing, _
Cache.NoAbsoluteExpiration, _
New TimeSpan(0, 20, 0), _
CacheItemPriority.Default, Nothing)
End If
Return ds
End Function
Private Function IsPathVirtual(ByVal virtualPath As String) As Boolean
Dim checkPath As String
checkPath = VirtualPathUtility.ToAppRelative(virtualPath)
Return checkPath.StartsWith("~/vrdir", StringComparison.InvariantCultureIgnoreCase)
End Function
Public Overrides Function FileExists(ByVal virtualPath As String) As Boolean
If (IsPathVirtual(virtualPath)) Then
Dim file As SampleVirtualFile
file = CType(GetFile(virtualPath), SampleVirtualFile)
Return file.Exists
Else
Return Previous.FileExists(virtualPath)
End If
End Function
Public Overrides Function DirectoryExists(ByVal virtualDir As String) As Boolean
If (IsPathVirtual(virtualDir)) Then
Dim dir As SampleVirtualDirectory
dir = CType(GetDirectory(virtualDir), SampleVirtualDirectory)
Return dir.exists
Else
Return Previous.DirectoryExists(virtualDir)
End If
End Function
Public Overrides Function GetFile(ByVal virtualPath As String) As VirtualFile
If (IsPathVirtual(virtualPath)) Then
Return New SampleVirtualFile(virtualPath, Me)
Else
Return Previous.GetFile(virtualPath)
End If
End Function
Public Overrides Function GetDirectory(ByVal virtualDir As String) As VirtualDirectory
If (IsPathVirtual(virtualDir)) Then
Return New SampleVirtualDirectory(virtualDir, Me)
Else
Return Previous.GetDirectory(virtualDir)
End If
End Function
Public Overrides Function GetCacheDependency(ByVal virtualPath As String, ByVal virtualPathDependencies As IEnumerable, ByVal utcStart As Date) As CacheDependency
If (IsPathVirtual(virtualPath)) Then
Dim fullPathDependencies As System.Collections.Specialized.StringCollection
fullPathDependencies = Nothing
' Get the full path to all dependencies.
For Each virtualDependency As String In virtualPathDependencies
If fullPathDependencies Is Nothing Then
fullPathDependencies = New System.Collections.Specialized.StringCollection
End If
fullPathDependencies.Add(virtualDependency)
Next
If fullPathDependencies Is Nothing Then
Return Nothing
End If
Dim fullPathDependenciesArray As String()
fullPathDependencies.CopyTo(fullPathDependenciesArray, 0)
Return New CacheDependency(fullPathDependenciesArray, utcStart)
Else
Return Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart)
End If
End Function
End Class
End Namespace
Druhý příklad je datový soubor XML použitý k naplnění objektu DataSet vráceného vlastním VirtualPathProvider objektem. Tato data XML se používají k předvedení použití VirtualPathProviderVirtualDirectoryVirtualFile a objektů k načtení dat z externích dat a nejsou určeny k reprezentaci úložiště dat v produkční kvalitě.
<?xml version="1.0" encoding="utf-8" ?>
<resource type="dir"
path="/vrDir"
parentPath=""
content="">
<resource type="file"
path="/vrDir/Level1FileA.vrf"
parentPath="/vrDir"
content="This is the content of file Level1FileA.">
</resource>
<resource type="file"
path="/vrDir/Level1FileB.vrf"
parentPath="/vrDir"
content="This is the content of file Level1FileB.">
</resource>
<resource type="dir"
path="/vrDir/Level2DirA"
parentPath="/vrDir"
content="">
<resource type="file"
path="/vrDir/Level2DirA/Level2FileA.vrf"
parentPath="/vrDir/Level2DirA"
content="This is the content of file Level2FileA.">
</resource>
<resource type="file"
path="/vrDir/Level2DirA/Level2FileB.vrf"
parentPath="/vrDir/Level2DirA"
content="This is the content of file Level2FileB.">
</resource>
</resource>
<resource type="dir"
path="/vrDir/Level2DirB"
parentPath="/vrDir"
content="">
<resource type="file"
path="/vrDir/Level2DirB/Level2FileA.vrf"
parentPath="/vrDir/Level2DirB"
content="This is the content of file Level2FileA.">
</resource>
<resource type="file"
path="/vrDir/Level2DirB/Level2FileB.vrf"
parentPath="/vrDir/Level2DirB"
content="This is the content of file Level2FileB.">
</resource>
</resource>
</resource>
Třetí příklad poskytuje AppStart objekt, který obsahuje metodu AppInitialize . Tato metoda se volá během inicializace ASP.NET aplikace k provedení jakékoli vlastní inicializace požadované. V tomto případě zaregistruje vlastní objekt VirtualPathProvider v systému sestavení ASP.NET.
using System.Web.Hosting;
namespace Samples.AspNet.CS
{
/// <summary>
/// Contains the application initialization method
/// for the sample application.
/// </summary>
public static class AppStart
{
public static void AppInitialize()
{
SamplePathProvider sampleProvider = new SamplePathProvider();
HostingEnvironment.RegisterVirtualPathProvider(sampleProvider);
}
}
}
Imports System.Web.Hosting
Namespace Samples.AspNet.VB
Public Class AppStart
Public Shared Sub AppInitialize()
Dim sampleProvider As SamplePathProvider = New SamplePathProvider()
HostingEnvironment.RegisterVirtualPathProvider(sampleProvider)
End Sub
End Class
End Namespace
Poslední příklad je stránka ASP.NET, která obsahuje odkazy na virtuální soubory obsažené ve virtuálním systému souborů.
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html" />
<title>Virtual Path Provider Example</title>
</head>
<body>
<form id="form1" runat="server">
<asp:HyperLink ID="hyperLink1" runat="server" NavigateUrl="vrDir/Level1FileA.vrf" Text="Level 1, File A" /><br />
<asp:HyperLink ID="hyperLink2" runat="server" NavigateUrl="vrDir/Level1FileB.vrf" Text="Level 1, File B" /><br />
<asp:HyperLink ID="hyperLink3" runat="server" NavigateUrl="vrDir/Level2DirA/Level2FileA.vrf" Text="Level 2a, File A" /><br />
<asp:HyperLink ID="hyperLink4" runat="server" NavigateUrl="vrDir/Level2DirA/Level2FileB.vrf" Text="Level 2a, File B" /><br />
<asp:HyperLink ID="hyperLink5" runat="server" NavigateUrl="vrDir/Level2DirB/Level2FileA.vrf" Text="Level 2b, File A" /><br />
<asp:HyperLink ID="hyperLink6" runat="server" NavigateUrl="vrDir/Level2DirB/Level2FileB.vrf" Text="Level 2b, File B" /><br />
</form>
</body>
</html>
<%@ Page Language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<meta http-equiv="Content-Type" content="text/html" />
<title>Virtual Path Provider Example</title>
</head>
<body>
<form id="form1" runat="server">
<asp:HyperLink ID="hyperLink1" runat="server" NavigateUrl="vrDir/Level1FileA.vrf" Text="Level 1, File A" /><br />
<asp:HyperLink ID="hyperLink2" runat="server" NavigateUrl="vrDir/Level1FileB.vrf" Text="Level 1, File B" /><br />
<asp:HyperLink ID="hyperLink3" runat="server" NavigateUrl="vrDir/Level2DirA/Level2FileA.vrf" Text="Level 2a, File A" /><br />
<asp:HyperLink ID="hyperLink4" runat="server" NavigateUrl="vrDir/Level2DirA/Level2FileB.vrf" Text="Level 2a, File B" /><br />
<asp:HyperLink ID="hyperLink5" runat="server" NavigateUrl="vrDir/Level2DirB/Level2FileA.vrf" Text="Level 2b, File A" /><br />
<asp:HyperLink ID="hyperLink6" runat="server" NavigateUrl="vrDir/Level2DirB/Level2FileB.vrf" Text="Level 2b, File B" /><br />
</form>
</body>
</html>
Poznámky
Třída VirtualPathProvider poskytuje sadu metod pro implementaci virtuálního systému souborů pro webovou aplikaci. Ve virtuálním systému souborů se soubory a adresáře spravují jiným úložištěm dat, než je systém souborů poskytovaný operačním systémem serveru. Můžete například použít virtuální systém souborů k ukládání obsahu do SQL Server databáze.
Všechny soubory zpracovávané na vyžádání můžete uložit ve virtuálním systému souborů. Sem patří:
ASP.NET stránky, stránky předlohy, uživatelské ovládací prvky a další objekty.
Standardní webové stránky s rozšířeními, jako jsou .htm a .jpg.
Jakékoli vlastní rozšíření namapované na BuildProvider instanci.
Libovolný pojmenovaný motiv ve
App_Themesložce
Nelze ukládat ASP.NET složek aplikací nebo souborů, které generují sestavení na úrovni aplikace ve virtuálním systému souborů. Sem patří:
Soubor Global.asax.
Web.config soubory.
Datové soubory mapy webu používané nástrojem XmlSiteMapProvider.
Adresáře, které obsahují sestavení aplikace nebo které generují sestavení aplikace:
Bin,App_Code,App_GlobalResources, libovolnáApp_LocalResources.Složka dat aplikace,
App_Data.
Note
Pokud je web předkompilován pro nasazení, obsah poskytovaný VirtualPathProvider instancí není zkompilován a předkompilovaný web nepoužívá žádné VirtualPathProvider instance.
Registrace nástroje VirtualPathProvider
Vlastní instance VirtualPathProvider by měla být registrována v systému kompilace ASP.NET pomocí metody HostingEnvironment.RegisterVirtualPathProvider předtím, než webová aplikace provede analýzu nebo kompilaci stránky.
Instance je obvykle VirtualPathProvider registrována v metodě definované v AppInitializeApp_Code adresáři nebo během Application_Start události v Global.asax souboru. Příklad registrace VirtualPathProvider instance v metodě najdete v AppInitialize části Příklad.
Instanci můžete zaregistrovat VirtualPathProvider během jiných událostí, ale stránky kompilované a uložené v mezipaměti před VirtualPathProvider registrací instance nebudou neplatné, i když by nová VirtualPathProvider instance nyní poskytla zdroj pro dříve kompilovanou stránku.
Poznámky pro implementátory
Když dědíte z VirtualPathProvider, musíte přepsat následující členy:
Pokud vaše vlastní VirtualPathProvider třída podporuje adresáře ve virtuálním systému souborů, musíte přepsat následující členy.
-
Poznámka: Pokud bude váš virtuální systém souborů obsahovat motivy pro web (vytvořením virtuálního
App_Themesadresáře), musí vaše vlastní VirtualPathProvider třída podporovat adresáře.Vlastní VirtualPathProvider třída pracuje s třídami odvozenými z tříd VirtualFile a VirtualDirectory tříd. Měli byste implementovat odvozené třídy z těchto typů k poskytnutí informací o souborech a adresářích z vašeho virtuálního systému souborů. Příklad vlastní VirtualFile implementace najdete v části Příklad tématu přehledu VirtualFile třídy. Příklad vlastní VirtualDirectory implementace najdete v části Příklad tématu přehledu VirtualDirectory třídy.
Konstruktory
| Name | Description |
|---|---|
| VirtualPathProvider() |
Inicializuje třídu pro použití zděděnou instancí třídy. Tento konstruktor lze volat pouze zděděnou třídou. |
Vlastnosti
| Name | Description |
|---|---|
| Previous |
Získá odkaz na dříve zaregistrovaný VirtualPathProvider objekt v systému kompilace. |
Metody
| Name | Description |
|---|---|
| CombineVirtualPaths(String, String) |
Kombinuje základní cestu s relativní cestou k vrácení úplné cesty k virtuálnímu prostředku. |
| CreateObjRef(Type) |
Vytvoří objekt, který obsahuje všechny relevantní informace potřebné k vygenerování proxy serveru sloužícího ke komunikaci se vzdáleným objektem. (Zděděno od MarshalByRefObject) |
| DirectoryExists(String) |
Získá hodnotu, která určuje, zda adresář existuje ve virtuálním systému souborů. |
| Equals(Object) |
Určuje, zda je zadaný objekt roven aktuálnímu objektu. (Zděděno od Object) |
| FileExists(String) |
Získá hodnotu, která určuje, zda soubor existuje ve virtuálním systému souborů. |
| GetCacheDependency(String, IEnumerable, DateTime) |
Vytvoří závislost mezipaměti na základě zadaných virtuálních cest. |
| GetCacheKey(String) |
Vrátí klíč mezipaměti, který se použije pro zadanou virtuální cestu. |
| GetDirectory(String) |
Získá virtuální adresář z virtuálního systému souborů. |
| GetFile(String) |
Získá virtuální soubor z virtuálního systému souborů. |
| GetFileHash(String, IEnumerable) |
Vrátí hodnotu hash zadaných virtuálních cest. |
| GetHashCode() |
Slouží jako výchozí funkce hash. (Zděděno od Object) |
| GetLifetimeService() |
Zastaralé.
Načte objekt služby aktuální životnosti, který řídí zásady životnosti pro tuto instanci. (Zděděno od MarshalByRefObject) |
| GetType() |
Získá Type aktuální instance. (Zděděno od Object) |
| Initialize() |
Inicializuje VirtualPathProvider instanci. |
| InitializeLifetimeService() |
Poskytuje objekt VirtualPathProvider nekonečné životnosti tím, že brání vytvoření zapůjčení. |
| MemberwiseClone() |
Vytvoří mělkou kopii aktuálního Object. (Zděděno od Object) |
| MemberwiseClone(Boolean) |
Vytvoří mělkou kopii aktuálního MarshalByRefObject objektu. (Zděděno od MarshalByRefObject) |
| OpenFile(String) |
Vrátí datový proud z virtuálního souboru. |
| ToString() |
Vrátí řetězec, který představuje aktuální objekt. (Zděděno od Object) |