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číst 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 pracuje s příklady kódu pro VirtualFile třídy a VirtualDirectory k poskytování virtuálních prostředků z úložiště dat, které je načteno do objektu DataSet .
Tento příklad má čtyři části: VirtualPathProvider implementace třídy, datový soubor XML sloužící k naplnění objektu DataSet , AppStart
objekt, který obsahuje metodu AppInitialize
používanou k registraci VirtualPathProvider třídy v systému kompilace, a ASP.NET stránku, která poskytuje odkazy na virtuální soubory.
Chcete-li použít tento vzorový kód v aplikaci, postupujte podle těchto kroků.
Vytvořte ukázkovou aplikaci na webovém serveru.
Zkopírujte zdrojový kód vlastního VirtualPathProvider objektu (viz níže) do souboru v adresáři aplikace
App_Code
.Zkopírujte zdrojový kód vlastního VirtualDirectory objektu (viz část Příklad v VirtualDirectory tématu s přehledem třídy) do souboru v adresáři aplikace
App_Code
.Zkopírujte zdrojový kód vlastního VirtualFile objektu (viz část Příklad v VirtualFile tématu s přehledem 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.xml
do souboru v adresáři aplikaceApp_Data
.default.aspx
Zkopírujte soubor (viz níže) do kořenového adresáře ukázkové aplikace. Otevřete soubor ve webovémdefault.aspx
prohlížeči a kliknutím na odkazy na stránce zobrazte obsah virtuálních souborů.
Prvním příkladem je vlastní VirtualPathProvider třída. Metody DirectoryExists a FileExists jsou přepsány, aby bylo uvedeno, zda je požadovaný adresář přítomen ve virtuálním systému souborů. Metody GetDirectory a GetFile jsou přepsány tak, aby vracely vlastní VirtualDirectory instance a VirtualFile obsahující informace z virtuálního systému souborů.
Třída také poskytuje metodu GetVirtualData
používanou třídami VirtualDirectory a VirtualFile pro přístup k objektu DataSet obsahujícímu data virtuálního systému souborů. V produkční implementaci by tato metoda obvykle byla implementována 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ým příkladem je datový soubor XML sloužící k naplnění objektu DataSet vráceného vlastním VirtualPathProvider objektem. Tato data XML slouží k předvedení použití VirtualPathProviderobjektů , VirtualDirectorya VirtualFile k načtení dat z externích dat a není určena k reprezentaci úložiště dat produkční kvality.
<?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 je volána během inicializace ASP.NET aplikace k provedení jakékoli vlastní inicializace požadované. V tomto případě zaregistruje vlastní VirtualPathProvider objekt 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ím příkladem 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ů jsou soubory a adresáře spravovány jiným úložištěm dat, než je systém souborů poskytovaný operačním systémem serveru. Virtuální systém souborů můžete například použít k ukládání obsahu do SQL Server databáze.
Do virtuálního systému souborů můžete uložit jakýkoli soubor, který se zpracuje na vyžádání. 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í mapované na BuildProvider instanci.
Libovolný pojmenovaný motiv ve
App_Theme
složce
Ve virtuálním systému souborů nelze ukládat ASP.NET složky aplikací nebo soubory, které generují sestavení na úrovni aplikace. Sem patří:
Soubor Global.asax.
Web.config souborů.
Datové soubory mapy webu používané XmlSiteMapProvidernástrojem .
Adresáře, které obsahují sestavení aplikace nebo které generují sestavení aplikací:
Bin
,App_Code
,App_GlobalResources
, jakékoliApp_LocalResources
.Složka dat aplikace .
App_Data
Poznámka
Pokud je web předkompilován pro nasazení, obsah poskytnutý VirtualPathProvider instancí není zkompilován a předkompilovaný web nepoužívá žádné VirtualPathProvider instance.
Registrace VirtualPathProvider
Vlastní VirtualPathProvider instance by měla být zaregistrována v systému kompilace ASP.NET pomocí HostingEnvironment.RegisterVirtualPathProvider metody před provedením jakékoli analýzy nebo kompilace stránky webovou aplikací.
Instance VirtualPathProvider je obvykle registrována v AppInitialize
metodě definované v adresáři App_Code
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 zkompilované a uložené v mezipaměti před registrací instance nebudou VirtualPathProvider zneplatněné, i když by nová VirtualPathProvider instance nyní poskytovala zdroj pro dříve zkompilovanou 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 virtuální systém souborů obsahovat motivy pro web (vytvořením virtuálního
App_Themes
adresáře), VirtualPathProvider vlastní třída musí podporovat adresáře.Vlastní VirtualPathProvider třída pracuje s třídami odvozenými z VirtualFile tříd a VirtualDirectory . Z těchto typů byste měli implementovat odvozené třídy, které poskytují informace 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 s přehledem VirtualFile třídy. Příklad vlastní VirtualDirectory implementace najdete v části Příklad tématu s přehledem VirtualDirectory třídy.
Konstruktory
VirtualPathProvider() |
Inicializuje třídu pro použití zděděnou instancí třídy. Tento konstruktor může být volána pouze zděděnou třídou. |
Vlastnosti
Previous |
Získá odkaz na dříve zaregistrovaný VirtualPathProvider objekt v systému kompilace. |
Metody
CombineVirtualPaths(String, String) |
Kombinuje základní cestu s relativní cestou, aby se vrátila úplná cesta k virtuálnímu prostředku. |
CreateObjRef(Type) |
Vytvoří objekt, který obsahuje všechny relevantní informace potřebné k vygenerování proxy sloužící ke komunikaci se vzdáleným objektem. (Zděděno od MarshalByRefObject) |
DirectoryExists(String) |
Získá hodnotu, která označuje, zda adresář existuje ve virtuálním systému souborů. |
Equals(Object) |
Určí, zda se zadaný objekt rovná aktuálnímu objektu. (Zděděno od Object) |
FileExists(String) |
Získá hodnotu, která označ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 má použít 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í hashovací funkce. (Zděděno od Object) |
GetLifetimeService() |
Zastaralé.
Načte aktuální životnost objektu služby, který řídí zásady životnosti pro tuto instanci. (Zděděno od MarshalByRefObject) |
GetType() |
Type Získá z aktuální instance. (Zděděno od Object) |
Initialize() |
Inicializuje VirtualPathProvider instanci. |
InitializeLifetimeService() |
Dává objektu VirtualPathProvider nekonečnou životnost tím, že zabrání vytvoření zapůjčení. |
MemberwiseClone() |
Vytvoří mělkou kopii aktuálního Objectsouboru . (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) |