VirtualPathProvider Classe

Definição

Fornece um conjunto de métodos que permitem a uma aplicação Web recuperar recursos de um sistema de ficheiros 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 seguinte é uma VirtualPathProvider implementação de classe que cria um sistema de ficheiros virtual usando informação armazenada num DataSet objeto. O exemplo de código funciona com os exemplos de código para as VirtualFile classes and VirtualDirectory para fornecer recursos virtuais a partir de um armazenamento de dados que é carregado num DataSet objeto.

Este exemplo tem quatro partes: a implementação da classe VirtualPathProvider, um ficheiro de dados XML usado para preencher o objeto DataSet, um objeto AppStart que contém um método AppInitialize usado para registar a classe VirtualPathProvider no sistema de compilação, e uma página ASP.NET que fornece ligações para os ficheiros virtuais.

Para usar este código de exemplo numa aplicação, siga estes passos.

  1. Crie uma aplicação de exemplo no seu servidor Web.

  2. Copie o código-fonte do objeto personalizado VirtualPathProvider (ver abaixo) para um ficheiro no diretório da App_Code aplicação.

  3. Copie o código-fonte do objeto personalizado VirtualDirectory (ver a secção Exemplo no VirtualDirectory tópico de visão geral da aula) para um ficheiro no diretório da App_Code aplicação.

  4. Copie o código-fonte do objeto personalizado VirtualFile (ver a secção Exemplo no VirtualFile tópico de visão geral da aula) para um ficheiro no diretório da App_Code aplicação.

  5. Copie o código-fonte do AppStart objeto (ver abaixo) para um ficheiro no diretório da App_Code aplicação.

  6. Copie os dados XML (ver abaixo) para um ficheiro nomeado XMLData.xml num ficheiro no diretório da App_Data aplicação.

  7. Copie o default.aspx ficheiro (ver abaixo) para o diretório raiz da aplicação de exemplo. Use um navegador web para abrir o default.aspx ficheiro e depois clique nos links na página para ver o conteúdo dos ficheiros virtuais.

O primeiro exemplo é uma classe personalizada VirtualPathProvider . Os DirectoryExists métodos e FileExists são sobrepostos para indicar se existe um diretório solicitado no sistema de ficheiros virtual. Os GetDirectory métodos e GetFile são sobrepostos para devolver instâncias personalizadas VirtualDirectory e VirtualFile que contenham informação do sistema de ficheiros virtual.

A classe também fornece um GetVirtualData método utilizado pelas VirtualDirectory classes e VirtualFile para aceder ao DataSet objeto que contém os dados do sistema de ficheiros virtuais. Numa implementação em produção, este método seria tipicamente implementado num objeto de negócio 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 ficheiro de dados XML usado para preencher o DataSet objeto devolvido pelo objeto personalizado VirtualPathProvider . Estes dados XML são usados para demonstrar o uso dos VirtualPathProvider, VirtualDirectory, e 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. Este método é chamado durante a inicialização de uma aplicação ASP.NET para realizar qualquer inicialização personalizada necessária. Neste caso, regista o objeto personalizado VirtualPathProvider com o sistema de compilação 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 ligações para os ficheiros virtuais contidos no sistema de ficheiros virtual.


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

Observações

A VirtualPathProvider classe fornece um conjunto de métodos para implementar um sistema de ficheiros virtual para uma aplicação Web. Num sistema de ficheiros virtual, os ficheiros e diretórios são geridos por um armazenamento de dados diferente do sistema de ficheiros fornecido pelo sistema operativo do servidor. Por exemplo, pode usar um sistema de ficheiros virtual para armazenar conteúdo numa base de dados SQL Server.

Pode armazenar qualquer ficheiro que seja processado a pedido num sistema de ficheiros virtual. Isto inclui:

  • ASP.NET páginas, páginas mestres, controlos de utilizador e outros objetos.

  • Páginas 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 pode armazenar pastas ou ficheiros de aplicação ASP.NET que gerem assemblies a nível de aplicação num sistema de ficheiros virtual. Isto inclui:

  • O ficheiro Global.asax.

  • Web.config ficheiros.

  • Ficheiros de mapas de sítios utilizados pelo XmlSiteMapProvider.

  • Diretórios que contêm assemblies de aplicações ou que geram assemblies de aplicação: Bin, App_Code, App_GlobalResources, quaisquer App_LocalResources.

  • A pasta de dados da aplicação, App_Data.

Note

Se um site está pré-compilado para implementação, o conteúdo fornecido por uma VirtualPathProvider instância não é compilado e nenhuma VirtualPathProvider instância é utilizada pelo site pré-compilado.

Registo de um VirtualPathProvider

Uma instância personalizada VirtualPathProvider deve ser registada no sistema de compilação ASP.NET utilizando o método HostingEnvironment.RegisterVirtualPathProvider antes de qualquer análise ou compilação de páginas ser realizada pela aplicação Web.

Normalmente, uma VirtualPathProvider instância é registada num AppInitialize método definido no App_Code diretório, ou durante o Application_Start evento no Global.asax ficheiro. Para um exemplo de registo de uma VirtualPathProvider instância num AppInitialize método, veja a secção Exemplo.

Pode registar uma VirtualPathProvider instância durante outros eventos, mas as páginas compiladas e armazenadas em cache antes da VirtualPathProvider instância ser registada não serão invalidadas, mesmo que a nova VirtualPathProvider instância agora forneça o código-fonte da página previamente compilada.

Notas para Implementadores

Quando herdar de VirtualPathProvider, deve sobrepor-se aos seguintes membros:

Se a sua classe personalizada VirtualPathProvider suportar diretórios no sistema de ficheiros virtual, deve sobrescrever os seguintes membros.

  • DirectoryExists(String)

  • GetDirectory(String)

    Note: If your virtual file system will contain themes for the Web site (by creating a virtual <code data-dev-comment-type="c">App_Themes</code> directory), your custom <xref data-throw-if-not-resolved="true" uid="System.Web.Hosting.VirtualPathProvider"></xref> class must support directories.
    

    Uma classe personalizada VirtualPathProvider trabalha com classes derivadas das VirtualFile classes e VirtualDirectory . Deve implementar classes derivadas destes tipos para fornecer informação de ficheiros e diretórios do seu sistema virtual de ficheiros. Para um exemplo de implementação personalizada VirtualFile , veja a secção Exemplo do VirtualFile tópico de visão geral da aula. Para um exemplo de implementação personalizada VirtualDirectory , veja a secção Exemplo do VirtualDirectory tópico de visão geral da aula.

Construtores

Name Description
VirtualPathProvider()

Inicializa a classe para uso por uma instância de classe herdada. Este construtor só pode ser chamado por uma classe herdada.

Propriedades

Name Description
Previous

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

Métodos

Name Description
CombineVirtualPaths(String, String)

Combina um caminho base com um caminho relativo para devolver um caminho completo a um recurso virtual.

CreateObjRef(Type)

Cria um objeto que contém toda a informação relevante necessária para gerar um proxy usado para comunicar com um objeto remoto.

(Herdado de MarshalByRefObject)
DirectoryExists(String)

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

Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.

(Herdado de Object)
FileExists(String)

Obtém um valor que indica se existe um ficheiro no sistema de ficheiros virtual.

GetCacheDependency(String, IEnumerable, DateTime)

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

GetCacheKey(String)

Devolve uma chave de cache para usar no caminho virtual especificado.

GetDirectory(String)

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

GetFile(String)

Obtém um ficheiro virtual do sistema de ficheiros virtual.

GetFileHash(String, IEnumerable)

Devolve um hash dos caminhos virtuais especificados.

GetHashCode()

Serve como função de hash predefinida.

(Herdado de Object)
GetLifetimeService()

Recupera o objeto de serviço de tempo de vida atual que controla a política de vida útil neste caso.

(Herdado de MarshalByRefObject)
GetType()

Obtém o Type da instância atual.

(Herdado de Object)
Initialize()

Inicializa a VirtualPathProvider instância.

InitializeLifetimeService()

Dá ao VirtualPathProvider objeto uma vida útil infinita ao impedir a criação de um contrato de arrendamento.

MemberwiseClone()

Cria uma cópia superficial do atual Object.

(Herdado de Object)
MemberwiseClone(Boolean)

Cria uma cópia superficial do objeto atual MarshalByRefObject .

(Herdado de MarshalByRefObject)
OpenFile(String)

Devolve um fluxo de um ficheiro virtual.

ToString()

Devolve uma cadeia que representa o objeto atual.

(Herdado de Object)

Aplica-se a