VirtualPathProvider Clase

Definición

Proporciona un conjunto de métodos que permiten a una aplicación Web recuperar los recursos de un sistema de archivos virtual.

public ref class VirtualPathProvider abstract : MarshalByRefObject
public abstract class VirtualPathProvider : MarshalByRefObject
type VirtualPathProvider = class
    inherit MarshalByRefObject
Public MustInherit Class VirtualPathProvider
Inherits MarshalByRefObject
Herencia
VirtualPathProvider

Ejemplos

El ejemplo de código siguiente es una VirtualPathProvider implementación de clase que crea un sistema de archivos virtual mediante la información almacenada en un DataSet objeto . El ejemplo de código funciona con los ejemplos de código de las VirtualFile clases y VirtualDirectory para proporcionar recursos virtuales de un almacén de datos que se carga en un DataSet objeto .

Este ejemplo tiene cuatro partes: la implementación de la VirtualPathProvider clase, un archivo de datos XML utilizado para rellenar el DataSet objeto, un AppStart objeto que contiene un AppInitialize método utilizado para registrar la VirtualPathProvider clase con el sistema de compilación y una página de ASP.NET que proporciona vínculos a los archivos virtuales.

Para usar este código de ejemplo en una aplicación, siga estos pasos.

  1. Cree una aplicación de ejemplo en el servidor web.

  2. Copie el código fuente del objeto personalizado VirtualPathProvider (consulte a continuación) en un archivo del directorio de App_Code la aplicación.

  3. Copie el código fuente del objeto personalizado VirtualDirectory (consulte la sección Ejemplo del tema de información general de la VirtualDirectory clase) en un archivo del directorio de App_Code la aplicación.

  4. Copie el código fuente del objeto personalizado VirtualFile (consulte la sección Ejemplo del tema de información general de la VirtualFile clase) en un archivo del directorio de App_Code la aplicación.

  5. Copie el código fuente del AppStart objeto (consulte a continuación) en un archivo en el directorio de App_Code la aplicación.

  6. Copie los datos XML (vea a continuación) en un archivo denominado XMLData.xml en un archivo del directorio de App_Data la aplicación.

  7. Copie el default.aspx archivo (consulte a continuación) en el directorio raíz de la aplicación de ejemplo. Use un explorador web para abrir el default.aspx archivo y, a continuación, haga clic en los vínculos de la página para ver el contenido de los archivos virtuales.

El primer ejemplo es una clase personalizada VirtualPathProvider . Los DirectoryExists métodos y FileExists se invalidan para indicar si un directorio solicitado está presente en el sistema de archivos virtual. Los GetDirectory métodos y GetFile se invalidan para devolver instancias personalizadas VirtualDirectory y VirtualFile que contienen información del sistema de archivos virtual.

La clase también proporciona un GetVirtualData método utilizado por las VirtualDirectory clases y VirtualFile para tener acceso al DataSet objeto que contiene los datos del sistema de archivos virtual. En una implementación de producción, este método normalmente se implementaría en un objeto de negocio responsable de interactuar con el almacén de datos.

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

El segundo ejemplo es el archivo de datos XML utilizado para rellenar el DataSet objeto devuelto por el objeto personalizado VirtualPathProvider . Estos datos XML se usan para demostrar el uso de los VirtualPathProviderobjetos , VirtualDirectoryy VirtualFile para recuperar datos de datos externos y no está pensado para representar un almacén de datos de calidad de producción.

<?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>  

En el tercer ejemplo se proporciona un AppStart objeto que contiene un AppInitialize método . Se llama a este método durante la inicialización de una aplicación de ASP.NET para realizar cualquier inicialización personalizada necesaria. En este caso, registra el objeto personalizado VirtualPathProvider con el sistema de compilación 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

El último ejemplo es una página de ASP.NET que contiene vínculos a los archivos virtuales contenidos en el sistema de archivos virtuales.


<%@ 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>

Comentarios

La VirtualPathProvider clase proporciona un conjunto de métodos para implementar un sistema de archivos virtual para una aplicación web. En un sistema de archivos virtual, los archivos y directorios se administran mediante un almacén de datos distinto del sistema de archivos proporcionado por el sistema operativo del servidor. Por ejemplo, puede usar un sistema de archivos virtual para almacenar contenido en una base de datos de SQL Server.

Puede almacenar cualquier archivo que se procese a petición en un sistema de archivos virtual. Esto incluye:

  • ASP.NET páginas, páginas maestras, controles de usuario y otros objetos.

  • Páginas web estándar con extensiones como .htm y .jpg.

  • Cualquier extensión personalizada asignada a una BuildProvider instancia de .

  • Cualquier tema con nombre en la App_Theme carpeta.

No puede almacenar ASP.NET carpetas o archivos de aplicación que generen ensamblados de nivel de aplicación en un sistema de archivos virtual. Esto incluye:

  • El archivo Global.asax.

  • Web.config archivos.

  • Archivos de datos de mapa de sitio usados por .XmlSiteMapProvider

  • Directorios que contienen ensamblados de aplicación o que generan ensamblados de aplicación: Bin, App_Code, App_GlobalResources, cualquier App_LocalResources.

  • La carpeta de datos de la aplicación, App_Data.

Nota

Si un sitio web está precompilado para la implementación, el contenido proporcionado por una VirtualPathProvider instancia no se compila y el sitio precompilado no VirtualPathProvider usa ninguna instancia.

Registro de un virtualPathProvider

Una instancia personalizada VirtualPathProvider debe registrarse con el sistema de compilación de ASP.NET mediante el HostingEnvironment.RegisterVirtualPathProvider método antes de que la aplicación web realice cualquier análisis o compilación de páginas.

Normalmente, una VirtualPathProvider instancia se registra en un AppInitialize método definido en el App_Code directorio o durante el Application_Start evento en el Global.asax archivo. Para obtener un ejemplo de cómo registrar una VirtualPathProvider instancia en un AppInitialize método, vea la sección Ejemplo.

Puede registrar una VirtualPathProvider instancia durante otros eventos, pero las páginas compiladas y almacenadas en caché antes de que se registre la VirtualPathProvider instancia no se invalidarán, aunque la nueva VirtualPathProvider instancia proporcione ahora el origen de la página compilada anteriormente.

Notas a los implementadores

Al heredar de VirtualPathProvider, es necesario invalidar los miembros siguientes:.

Si la clase personalizada VirtualPathProvider admite directorios en el sistema de archivos virtual, debe invalidar los siguientes miembros.

  • DirectoryExists(String)

  • GetDirectory(String)

    Nota: Si el sistema de archivos virtual contendrá temas para el sitio web (mediante la creación de un directorio virtual App_Themes ), la clase personalizada VirtualPathProvider debe admitir directorios.

    Una clase personalizada VirtualPathProvider funciona con clases derivadas de las VirtualFile clases y VirtualDirectory . Debe implementar clases derivadas de estos tipos para proporcionar información de archivos y directorios del sistema de archivos virtual. Para obtener un ejemplo de una implementación personalizada VirtualFile , vea la sección Ejemplo del tema de información general de la VirtualFile clase. Para obtener un ejemplo de una implementación personalizada VirtualDirectory , vea la sección Ejemplo del tema de información general de la VirtualDirectory clase.

Constructores

VirtualPathProvider()

Inicializa la clase para que la use una instancia de la clase heredada. A este constructor sólo lo puede llamar una clase heredada.

Propiedades

Previous

Obtiene una referencia a un objeto VirtualPathProvider previamente registrado del sistema de compilación.

Métodos

CombineVirtualPaths(String, String)

Combina una ruta de acceso base con una ruta de acceso relativa para devolver una ruta de acceso completa a un recurso virtual.

CreateObjRef(Type)

Crea un objeto que contiene toda la información relevante necesaria para generar un proxy utilizado para comunicarse con un objeto remoto.

(Heredado de MarshalByRefObject)
DirectoryExists(String)

Obtiene un valor que indica si existe un directorio en el sistema de archivos virtual.

Equals(Object)

Determina si el objeto especificado es igual que el objeto actual.

(Heredado de Object)
FileExists(String)

Obtiene un valor que indica si existe un archivo en el sistema de archivos virtual.

GetCacheDependency(String, IEnumerable, DateTime)

Crea una dependencia de caché basada en las rutas de acceso virtuales especificadas.

GetCacheKey(String)

Devuelve una clave de caché que se va a utilizar para la ruta de acceso virtual especificada.

GetDirectory(String)

Recibe un directorio virtual del sistema de archivos virtual.

GetFile(String)

Recibe un archivo virtual del sistema de archivos virtual.

GetFileHash(String, IEnumerable)

Devuelve un código hash de las rutas de acceso virtuales especificadas.

GetHashCode()

Sirve como la función hash predeterminada.

(Heredado de Object)
GetLifetimeService()
Obsoletos.

Recupera el objeto de servicio de duración actual que controla la directiva de duración de esta instancia.

(Heredado de MarshalByRefObject)
GetType()

Obtiene el Type de la instancia actual.

(Heredado de Object)
Initialize()

Inicializa la instancia VirtualPathProvider.

InitializeLifetimeService()

Concede al objeto VirtualPathProvider una duración infinita ya que impide que se genere una concesión.

MemberwiseClone()

Crea una copia superficial del Object actual.

(Heredado de Object)
MemberwiseClone(Boolean)

Crea una copia superficial del objeto MarshalByRefObject actual.

(Heredado de MarshalByRefObject)
OpenFile(String)

Devuelve una secuencia de un archivo virtual.

ToString()

Devuelve una cadena que representa el objeto actual.

(Heredado de Object)

Se aplica a