VirtualPathProvider Classe
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
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
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.
Crie uma aplicação de exemplo no seu servidor Web.
Copie o código-fonte do objeto personalizado VirtualPathProvider (ver abaixo) para um ficheiro no diretório da
App_Codeaplicação.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_Codeaplicação.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_Codeaplicação.Copie o código-fonte do
AppStartobjeto (ver abaixo) para um ficheiro no diretório daApp_Codeaplicação.Copie os dados XML (ver abaixo) para um ficheiro nomeado
XMLData.xmlnum ficheiro no diretório daApp_Dataaplicação.Copie o
default.aspxficheiro (ver abaixo) para o diretório raiz da aplicação de exemplo. Use um navegador web para abrir odefault.aspxficheiro 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_Themepasta.
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, quaisquerApp_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.
-
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) |