VirtualPathProvider Classe
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
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
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.
Crie um aplicativo de exemplo no servidor Web.
Copie o código-fonte do objeto personalizado VirtualPathProvider (veja abaixo) em um arquivo no diretório do
App_Code
aplicativo.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.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.Copie o código-fonte do
AppStart
objeto (veja abaixo) em um arquivo no diretório doApp_Code
aplicativo.Copie os dados XML (veja abaixo) em um arquivo nomeado
XMLData.xml
em um arquivo no diretório doApp_Data
aplicativo.Copie o
default.aspx
arquivo (veja abaixo) no diretório raiz do aplicativo de exemplo. Use um navegador da Web para abrir odefault.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_GlobalResources
qualquerApp_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) |