VirtualPathProvider Classe
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
Fournit un jeu de méthodes qui permettent à une application Web de récupérer des ressources à partir d'un système de fichiers virtuel.
public ref class VirtualPathProvider abstract : MarshalByRefObject
public abstract class VirtualPathProvider : MarshalByRefObject
type VirtualPathProvider = class
inherit MarshalByRefObject
Public MustInherit Class VirtualPathProvider
Inherits MarshalByRefObject
- Héritage
Exemples
L’exemple de code suivant est une VirtualPathProvider implémentation de classe qui crée un système de fichiers virtuel à l’aide des informations stockées dans un DataSet objet . L’exemple de code fonctionne avec les exemples de code pour les VirtualFile classes et afin VirtualDirectory de fournir des ressources virtuelles à partir d’un magasin de données chargé dans un DataSet objet .
Cet exemple comprend quatre parties : l’implémentation de classe VirtualPathProvider , un fichier de données XML utilisé pour remplir l’objet DataSet , un AppStart
objet qui contient une AppInitialize
méthode utilisée pour inscrire la VirtualPathProvider classe auprès du système de compilation et une page ASP.NET qui fournit des liens vers les fichiers virtuels.
Pour utiliser cet exemple de code dans une application, procédez comme suit.
Créez un exemple d’application sur votre serveur Web.
Copiez le code source de l’objet personnalisé VirtualPathProvider (voir ci-dessous) dans un fichier du répertoire de
App_Code
l’application.Copiez le code source de l’objet personnalisé VirtualDirectory (voir la section Exemple dans la rubrique vue d’ensemble de la VirtualDirectory classe) dans un fichier du répertoire de
App_Code
l’application.Copiez le code source de l’objet personnalisé VirtualFile (voir la section Exemple dans la rubrique vue d’ensemble de la VirtualFile classe) dans un fichier du répertoire de
App_Code
l’application.Copiez le code source de l’objet
AppStart
(voir ci-dessous) dans un fichier du répertoire deApp_Code
l’application.Copiez les données XML (voir ci-dessous) dans un fichier nommé
XMLData.xml
dans un fichier du répertoire deApp_Data
l’application.Copiez le
default.aspx
fichier (voir ci-dessous) dans le répertoire racine de l’exemple d’application. Utilisez un navigateur web pour ouvrir ledefault.aspx
fichier, puis cliquez sur les liens de la page pour afficher le contenu des fichiers virtuels.
Le premier exemple est une classe personnalisée VirtualPathProvider . Les DirectoryExists méthodes et FileExists sont remplacées pour indiquer si un répertoire demandé est présent dans le système de fichiers virtuel. Les GetDirectory méthodes et GetFile sont remplacées pour retourner des instances personnalisées VirtualDirectory et VirtualFile contenant des informations du système de fichiers virtuel.
La classe fournit également une GetVirtualData
méthode utilisée par les VirtualDirectory classes et VirtualFile pour accéder à l’objet DataSet contenant les données du système de fichiers virtuel. Dans une implémentation de production, cette méthode est généralement implémentée dans un objet métier chargé d’interagir avec le magasin de données.
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
Le deuxième exemple est le fichier de données XML utilisé pour remplir l’objet DataSet retourné par l’objet personnalisé VirtualPathProvider . Ces données XML sont utilisées pour illustrer l’utilisation des VirtualPathProviderobjets , VirtualDirectoryet VirtualFile pour récupérer des données à partir de données externes et ne sont pas destinées à représenter un magasin de données de qualité production.
<?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>
Le troisième exemple fournit un AppStart
objet qui contient une AppInitialize
méthode. Cette méthode est appelée lors de l’initialisation d’une application ASP.NET pour effectuer toute initialisation personnalisée requise. Dans ce cas, il inscrit l’objet personnalisé VirtualPathProvider auprès du système de build 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
Le dernier exemple est une page ASP.NET qui contient des liens vers les fichiers virtuels contenus dans le système de fichiers virtuel.
<%@ 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>
Remarques
La VirtualPathProvider classe fournit un ensemble de méthodes permettant d’implémenter un système de fichiers virtuel pour une application web. Dans un système de fichiers virtuel, les fichiers et les répertoires sont gérés par un magasin de données autre que le système de fichiers fourni par le système d’exploitation du serveur. Par exemple, vous pouvez utiliser un système de fichiers virtuel pour stocker du contenu dans une base de données SQL Server.
Vous pouvez stocker n’importe quel fichier traité à la demande dans un système de fichiers virtuel. notamment :
ASP.NET pages, pages maîtres, contrôles utilisateur et autres objets.
Pages Web standard avec des extensions telles que .htm et .jpg.
Toute extension personnalisée mappée à une BuildProvider instance.
Tout thème nommé dans le
App_Theme
dossier.
Vous ne pouvez pas stocker ASP.NET dossiers d’application ou des fichiers qui génèrent des assemblys au niveau de l’application dans un système de fichiers virtuel. notamment :
Fichier Global.asax.
Web.config fichiers.
Fichiers de données de carte de site utilisés par .XmlSiteMapProvider
Répertoires qui contiennent des assemblys d’application ou qui génèrent des assemblys d’application :
Bin
,App_Code
,App_GlobalResources
, toutApp_LocalResources
.Dossier de données d’application,
App_Data
.
Notes
Si un site Web est précompilé pour le déploiement, le contenu fourni par une VirtualPathProvider instance n’est pas compilé et aucune instance n’est VirtualPathProvider utilisée par le site précompilé.
Inscription d’un VirtualPathProvider
Une instance personnalisée VirtualPathProvider doit être inscrite auprès du système de compilation ASP.NET à l’aide de la HostingEnvironment.RegisterVirtualPathProvider méthode avant qu’une analyse ou une compilation de pages ne soit effectuée par l’application web.
En règle générale, une VirtualPathProvider instance est inscrite dans une AppInitialize
méthode définie dans le App_Code
répertoire ou pendant l’événement Application_Start
dans le Global.asax
fichier. Pour obtenir un exemple d’inscription d’une VirtualPathProvider instance dans une AppInitialize
méthode, consultez la section Exemple.
Vous pouvez inscrire une VirtualPathProvider instance pendant d’autres événements, mais les pages compilées et mises en cache avant l’inscription de l’instance VirtualPathProvider ne sont pas invalidées, même si la nouvelle VirtualPathProvider instance fournit désormais la source de la page compilée précédemment.
Notes pour les responsables de l’implémentation
Lorsque vous héritez de VirtualPathProvider, vous devez substituer les membres suivants :
Si votre classe personnalisée VirtualPathProvider prend en charge les répertoires dans le système de fichiers virtuel, vous devez remplacer les membres suivants.
-
Remarque : Si votre système de fichiers virtuel contient des thèmes pour le site Web (en créant un répertoire virtuel
App_Themes
), votre classe personnalisée VirtualPathProvider doit prendre en charge les répertoires.Une classe personnalisée VirtualPathProvider fonctionne avec des classes dérivées des VirtualFile classes et .VirtualDirectory Vous devez implémenter des classes dérivées de ces types pour fournir des informations de fichiers et de répertoires à partir de votre système de fichiers virtuel. Pour obtenir un exemple d’implémentation personnalisée VirtualFile , consultez la section Exemple de la rubrique Vue d’ensemble de la VirtualFile classe. Pour obtenir un exemple d’implémentation personnalisée VirtualDirectory , consultez la section Exemple de la rubrique Vue d’ensemble de la VirtualDirectory classe.
Constructeurs
VirtualPathProvider() |
Initialise la classe pour qu'elle soit utilisée par une instance de la classe héritée. Ce constructeur peut être appelé uniquement par une classe héritée. |
Propriétés
Previous |
Obtient une référence à un objet VirtualPathProvider précédemment inscrit dans le système de compilation. |
Méthodes
CombineVirtualPaths(String, String) |
Combine un chemin d'accès de base avec un chemin d'accès relatif pour retourner un chemin d'accès complet à une ressource virtuelle. |
CreateObjRef(Type) |
Crée un objet contenant toutes les informations appropriées requises pour générer un proxy permettant de communiquer avec un objet distant. (Hérité de MarshalByRefObject) |
DirectoryExists(String) |
Obtient une valeur qui indique si un répertoire existe dans le système de fichiers virtuel. |
Equals(Object) |
Détermine si l'objet spécifié est égal à l'objet actuel. (Hérité de Object) |
FileExists(String) |
Obtient une valeur qui indique si un fichier existe dans le système de fichiers virtuel. |
GetCacheDependency(String, IEnumerable, DateTime) |
Crée une dépendance de cache basée sur les chemins d'accès virtuels spécifiés. |
GetCacheKey(String) |
Retourne une clé de cache à utiliser pour le chemin d'accès virtuel spécifié. |
GetDirectory(String) |
Obtient un répertoire virtuel à partir du système de fichiers virtuel. |
GetFile(String) |
Obtient un fichier virtuel à partir du système de fichiers virtuel. |
GetFileHash(String, IEnumerable) |
Retourne un hachage des chemins d'accès virtuels spécifiés. |
GetHashCode() |
Fait office de fonction de hachage par défaut. (Hérité de Object) |
GetLifetimeService() |
Obsolète.
Récupère l'objet de service de durée de vie en cours qui contrôle la stratégie de durée de vie de cette instance. (Hérité de MarshalByRefObject) |
GetType() |
Obtient le Type de l'instance actuelle. (Hérité de Object) |
Initialize() |
Initialise l’instance VirtualPathProvider. |
InitializeLifetimeService() |
Donne à l'objet VirtualPathProvider une durée de vie infinie en empêchant toute création de bail. |
MemberwiseClone() |
Crée une copie superficielle du Object actuel. (Hérité de Object) |
MemberwiseClone(Boolean) |
Crée une copie superficielle de l'objet MarshalByRefObject actuel. (Hérité de MarshalByRefObject) |
OpenFile(String) |
Retourne un flux à partir d'un fichier virtuel. |
ToString() |
Retourne une chaîne qui représente l'objet actuel. (Hérité de Object) |