Compartilhar via


VirtualPathProvider Classe

Definição

Fornece um conjunto de métodos que permitem que um aplicativo Web recupere recursos de um sistema de arquivos virtual.

public ref class VirtualPathProvider abstract : MarshalByRefObject
public abstract class VirtualPathProvider : MarshalByRefObject
type VirtualPathProvider = class
    inherit MarshalByRefObject
Public MustInherit Class VirtualPathProvider
Inherits MarshalByRefObject
Herança
VirtualPathProvider

Exemplos

O exemplo de código a seguir é uma VirtualPathProvider implementação de classe que cria um sistema de arquivos virtuais usando informações armazenadas em um DataSet objeto. O exemplo de código funciona com os exemplos de código para as classes e VirtualDirectory para VirtualFile fornecer recursos virtuais de um armazenamento de dados que é carregado em um DataSet objeto.

Este exemplo tem quatro partes: a implementação de VirtualPathProvider classe, um arquivo de dados XML usado para popular o DataSet objeto, um AppStart objeto que contém um AppInitialize método usado para registrar a VirtualPathProvider classe com o sistema de compilação e uma página ASP.NET que fornece links para os arquivos virtuais.

Para usar esse código de exemplo em um aplicativo, siga estas etapas.

  1. Crie um aplicativo de exemplo no servidor Web.

  2. Copie o código-fonte do objeto personalizado VirtualPathProvider (veja abaixo) em um arquivo no diretório do App_Code aplicativo.

  3. Copie o código-fonte do objeto personalizado VirtualDirectory (consulte a seção Exemplo no tópico de visão geral da VirtualDirectory classe) em um arquivo no diretório do App_Code aplicativo.

  4. Copie o código-fonte do objeto personalizado VirtualFile (consulte a seção Exemplo no tópico de visão geral da VirtualFile classe) em um arquivo no diretório do App_Code aplicativo.

  5. Copie o código-fonte do AppStart objeto (veja abaixo) em um arquivo no diretório do App_Code aplicativo.

  6. Copie os dados XML (veja abaixo) em um arquivo nomeado XMLData.xml em um arquivo no diretório do App_Data aplicativo.

  7. Copie o default.aspx arquivo (veja abaixo) no diretório raiz do aplicativo de exemplo. Use um navegador da Web para abrir o default.aspx arquivo e clique nos links na página para ver o conteúdo dos arquivos virtuais.

O primeiro exemplo é uma classe personalizada VirtualPathProvider . Os DirectoryExists métodos e os FileExists métodos são substituídos para indicar se um diretório solicitado está presente no sistema de arquivos virtuais. Os GetDirectory métodos e os GetFile métodos são substituídos para retornar instâncias personalizadas VirtualDirectory e VirtualFile que contêm informações do sistema de arquivos virtuais.

A classe também fornece um GetVirtualData método usado pelo VirtualDirectory e VirtualFile classes para acessar o DataSet objeto que contém os dados do sistema de arquivos virtuais. Em uma implementação de produção, esse método normalmente seria implementado em um objeto de negócios responsável por interagir com o armazenamento de dados.

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

O segundo exemplo é o arquivo de dados XML usado para popular o DataSet objeto retornado pelo objeto personalizado VirtualPathProvider . Esses dados XML são usados para demonstrar o uso do VirtualPathProvider, VirtualDirectorye VirtualFile objetos para recuperar dados de dados externos e não se destinam a representar um armazenamento de dados de qualidade de produção.

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

O terceiro exemplo fornece um AppStart objeto que contém um AppInitialize método. Esse método é chamado durante a inicialização de um aplicativo ASP.NET para executar qualquer inicialização personalizada necessária. Nesse caso, ele registra o objeto personalizado VirtualPathProvider com o sistema 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

O último exemplo é uma página ASP.NET que contém links para os arquivos virtuais contidos no sistema de arquivos virtuais.


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

Comentários

A VirtualPathProvider classe fornece um conjunto de métodos para implementar um sistema de arquivos virtuais para um aplicativo Web. Em um sistema de arquivos virtuais, os arquivos e diretórios são gerenciados por um armazenamento de dados diferente do sistema de arquivos fornecido pelo sistema operacional do servidor. Por exemplo, você pode usar um sistema de arquivos virtuais para armazenar conteúdo em um banco de dados SQL Server.

Você pode armazenar qualquer arquivo processado sob solicitação em um sistema de arquivos virtuais. Isso inclui:

  • ASP.NET páginas, páginas mestras, controles de usuário e outros objetos.

  • Páginas da Web padrão com extensões como .htm e .jpg.

  • Qualquer extensão personalizada mapeada para uma BuildProvider instância.

  • Qualquer tema nomeado na App_Theme pasta.

Não é possível armazenar ASP.NET pastas de aplicativo ou arquivos que geram assemblies no nível do aplicativo em um sistema de arquivos virtual. Isso inclui:

  • O arquivo Global.asax.

  • Web.config arquivos.

  • Arquivos de dados do mapa do site usados XmlSiteMapProviderpelo .

  • Diretórios que contêm assemblies de aplicativo ou que geram assemblies de aplicativo: Bin, App_Code, , App_GlobalResourcesqualquer App_LocalResources.

  • A pasta de dados do aplicativo. App_Data

Observação

Se um site da Web for pré-compilado para implantação, o conteúdo fornecido por uma VirtualPathProvider instância não será compilado e nenhuma VirtualPathProvider instância será usada pelo site pré-compilado.

Registrando um VirtualPathProvider

Uma instância personalizada VirtualPathProvider deve ser registrada com o sistema de compilação ASP.NET usando o HostingEnvironment.RegisterVirtualPathProvider método antes que qualquer análise ou compilação de página seja executada pelo aplicativo Web.

Normalmente, uma VirtualPathProvider instância é registrada em um AppInitialize método definido no App_Code diretório ou durante o Application_Start evento no Global.asax arquivo. Para obter um exemplo de registro de uma VirtualPathProvider instância em um AppInitialize método, consulte a seção Exemplo.

Você pode registrar uma VirtualPathProvider instância durante outros eventos, mas as páginas compiladas e armazenadas em cache antes que a VirtualPathProvider instância seja registrada não serão invalidadas, mesmo que a nova VirtualPathProvider instância forneça agora a origem da página compilada anteriormente.

Notas aos Implementadores

Ao herdar, VirtualPathProvidervocê deve substituir os seguintes membros:

Se sua classe personalizada VirtualPathProvider der suporte a diretórios no sistema de arquivos virtuais, você deverá substituir os membros a seguir.

Observação: se o sistema de arquivos virtuais contiver temas para o site (criando um diretório de App_Themes virtual), sua classe personalizada VirtualPathProvider deverá dar suporte a diretórios.

Uma classe personalizada VirtualPathProvider funciona com classes derivadas do e VirtualDirectory das VirtualFile classes. Você deve implementar classes derivadas desses tipos para fornecer informações de arquivo e diretório do sistema de arquivos virtuais. Para obter um exemplo de uma implementação personalizada VirtualFile , consulte a seção Exemplo do tópico de visão geral da VirtualFile classe. Para obter um exemplo de uma implementação personalizada VirtualDirectory , consulte a seção Exemplo do tópico de visão geral da VirtualDirectory classe.

Construtores

VirtualPathProvider()

Inicializa a classe para uso por uma instância de classe herdada. Esse construtor pode ser chamado apenas por uma classe herdada.

Propriedades

Previous

Obtém uma referência a um objeto VirtualPathProvider registrado anteriormente no sistema de compilação.

Métodos

CombineVirtualPaths(String, String)

Combina um caminho base com um caminho relativo para retornar um caminho completo para um recurso virtual.

CreateObjRef(Type)

Cria um objeto que contém todas as informações relevantes necessárias para gerar um proxy usado para se comunicar com um objeto remoto.

(Herdado de MarshalByRefObject)
DirectoryExists(String)

Obtém um valor que indica se um diretório existe no sistema de arquivos virtual.

Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.

(Herdado de Object)
FileExists(String)

Obtém um valor que indica se um arquivo existe no sistema de arquivos virtual.

GetCacheDependency(String, IEnumerable, DateTime)

Cria uma dependência de cache com base nos caminhos virtuais especificados.

GetCacheKey(String)

Retorna uma chave de cache a ser usada para o caminho virtual especificado.

GetDirectory(String)

Obtém um diretório virtual do sistema de arquivos virtual.

GetFile(String)

Obtém um arquivo virtual do sistema de arquivos virtual.

GetFileHash(String, IEnumerable)

Retorna um hash de caminhos virtuais especificados.

GetHashCode()

Serve como a função de hash padrão.

(Herdado de Object)
GetLifetimeService()
Obsoleto.

Recupera o objeto de serviço de tempo de vida atual que controla a política de ciclo de vida para esta instância.

(Herdado de MarshalByRefObject)
GetType()

Obtém o Type da instância atual.

(Herdado de Object)
Initialize()

Inicializa a instância VirtualPathProvider.

InitializeLifetimeService()

Fornece ao objeto VirtualPathProvider um tempo de vida infinito ao impedir que uma concessão seja criada.

MemberwiseClone()

Cria uma cópia superficial do Object atual.

(Herdado de Object)
MemberwiseClone(Boolean)

Cria uma cópia superficial do objeto MarshalByRefObject atual.

(Herdado de MarshalByRefObject)
OpenFile(String)

Retorna um fluxo de um arquivo virtual.

ToString()

Retorna uma cadeia de caracteres que representa o objeto atual.

(Herdado de Object)

Aplica-se a