VirtualPathProvider Klass
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Innehåller en uppsättning metoder som gör det möjligt för ett webbprogram att hämta resurser från ett virtuellt filsystem.
public ref class VirtualPathProvider abstract : MarshalByRefObject
public abstract class VirtualPathProvider : MarshalByRefObject
type VirtualPathProvider = class
inherit MarshalByRefObject
Public MustInherit Class VirtualPathProvider
Inherits MarshalByRefObject
- Arv
Exempel
Följande kodexempel är en VirtualPathProvider klassimplementering som skapar ett virtuellt filsystem med hjälp av information som lagras i ett DataSet objekt. Kodexemplet fungerar med kodexemplen för klasserna och VirtualDirectory för VirtualFile att tillhandahålla virtuella resurser från ett datalager som läses in i ett DataSet objekt.
Det här exemplet innehåller fyra delar: klassimplementeringen VirtualPathProvider, en XML-datafil som används för att fylla i objektet DataSet, ett AppStart-objekt som innehåller en AppInitialize-metod som används för att registrera klassen VirtualPathProvider med kompileringssystemet och en ASP.NET sida som innehåller länkar till de virtuella filerna.
Följ dessa steg om du vill använda den här exempelkoden i ett program.
Skapa ett exempelprogram på webbservern.
Kopiera källkoden för det anpassade VirtualPathProvider objektet (se nedan) till en fil i programmets
App_Codekatalog.Kopiera källkoden för det anpassade VirtualDirectory objektet (se avsnittet Exempel i VirtualDirectory avsnittet klassöversikt) till en fil i programmets
App_Codekatalog.Kopiera källkoden för det anpassade VirtualFile objektet (se avsnittet Exempel i VirtualFile avsnittet klassöversikt) till en fil i programmets
App_Codekatalog.Kopiera källkoden
AppStartför objektet (se nedan) till en fil i programmetsApp_Codekatalog.Kopiera XML-data (se nedan) till en fil med namnet
XMLData.xmltill en fil i programmetsApp_Datakatalog.default.aspxKopiera filen (se nedan) till rotkatalogen för exempelprogrammet. Använd en webbläsare för att öppnadefault.aspxfilen och klicka sedan på länkarna på sidan för att se innehållet i de virtuella filerna.
Det första exemplet är en anpassad VirtualPathProvider klass. Metoderna DirectoryExists och FileExists åsidosättas för att ange om en begärd katalog finns i det virtuella filsystemet. Metoderna GetDirectory och GetFile åsidosättas för att returnera anpassade VirtualDirectory instanser och VirtualFile instanser som innehåller information från det virtuella filsystemet.
Klassen innehåller också en GetVirtualData metod som används av VirtualDirectory klasserna och VirtualFile för att komma åt objektet DataSet som innehåller data i det virtuella filsystemet. I en produktionsimplementering implementeras den här metoden vanligtvis i ett affärsobjekt som ansvarar för att interagera med datalagret.
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
Det andra exemplet är XML-datafilen som används för att fylla i objektet DataSet som returneras av det anpassade VirtualPathProvider objektet. Dessa XML-data används för att demonstrera med hjälp av objekten VirtualPathProvider, VirtualDirectoryoch VirtualFile för att hämta data från externa data och är inte avsedda att representera ett datalager av produktionskvalitet.
<?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>
Det tredje exemplet innehåller ett AppStart objekt som innehåller en AppInitialize metod. Den här metoden anropas under initieringen av ett ASP.NET program för att utföra alla anpassade initieringar som krävs. I det här fallet registreras det anpassade VirtualPathProvider-objektet med ASP.NET build-systemet.
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
Det sista exemplet är en ASP.NET sida som innehåller länkar till de virtuella filerna som finns i det virtuella filsystemet.
<%@ 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>
Kommentarer
Klassen VirtualPathProvider innehåller en uppsättning metoder för att implementera ett virtuellt filsystem för ett webbprogram. I ett virtuellt filsystem hanteras filerna och katalogerna av ett annat datalager än filsystemet som tillhandahålls av serverns operativsystem. Du kan till exempel använda ett virtuellt filsystem för att lagra innehåll i en SQL Server databas.
Du kan lagra alla filer som bearbetas på begäran i ett virtuellt filsystem. Detta omfattar:
ASP.NET sidor, huvudsidor, användarkontroller och andra objekt.
Standardwebbsidor med tillägg som .htm och .jpg.
Alla anpassade tillägg som mappas till en BuildProvider instans.
Alla namngivna
App_Themetema i mappen.
Du kan inte lagra ASP.NET programmappar eller filer som genererar sammansättningar på programnivå i ett virtuellt filsystem. Detta omfattar:
Filen Global.asax.
Web.config filer.
Webbplatsöversiktsdatafiler som används av XmlSiteMapProvider.
Kataloger som innehåller programsammansättningar eller som genererar programsammansättningar:
Bin,App_Code, ,App_GlobalResourcesallaApp_LocalResources.Programdatamappen .
App_Data
Note
Om en webbplats är förkompilerad för distribution kompileras inte innehåll som tillhandahålls av en VirtualPathProvider instans och inga VirtualPathProvider instanser används av den förkompilerade webbplatsen.
Registrera en VirtualPathProvider
En anpassad VirtualPathProvider-instans bör registreras med ASP.NET kompileringssystem med hjälp av metoden HostingEnvironment.RegisterVirtualPathProvider innan någon sidparsing eller kompilering utförs av webbprogrammet.
Vanligtvis registreras en VirtualPathProvider instans i en AppInitialize metod som definierats i App_Code katalogen eller under Application_Start händelsen i Global.asax filen. Ett exempel på hur du registrerar en VirtualPathProvider instans i en AppInitialize metod finns i avsnittet Exempel.
Du kan registrera en VirtualPathProvider instans under andra händelser, men sidor som kompilerats och cachelagrats innan instansen VirtualPathProvider registreras kommer inte att ogiltigförklaras, även om den nya VirtualPathProvider instansen nu skulle tillhandahålla källan för den tidigare kompilerade sidan.
Anteckningar till implementerare
När du ärver från VirtualPathProvidermåste du åsidosätta följande medlemmar:
Om din anpassade VirtualPathProvider klass stöder kataloger i det virtuella filsystemet måste du åsidosätta följande medlemmar.
-
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.En anpassad VirtualPathProvider klass fungerar med klasser som härleds från klasserna VirtualFile och VirtualDirectory . Du bör implementera härledda klasser från dessa typer för att tillhandahålla fil- och kataloginformation från ditt virtuella filsystem. Ett exempel på en anpassad VirtualFile implementering finns i avsnittet Exempel i VirtualFile avsnittet klassöversikt. Ett exempel på en anpassad VirtualDirectory implementering finns i avsnittet Exempel i VirtualDirectory avsnittet klassöversikt.
Konstruktorer
| Name | Description |
|---|---|
| VirtualPathProvider() |
Initierar klassen för användning av en ärvd klassinstans. Den här konstruktorn kan bara anropas av en ärvd klass. |
Egenskaper
| Name | Description |
|---|---|
| Previous |
Hämtar en referens till ett tidigare registrerat VirtualPathProvider objekt i kompileringssystemet. |
Metoder
| Name | Description |
|---|---|
| CombineVirtualPaths(String, String) |
Kombinerar en bassökväg med en relativ sökväg för att returnera en fullständig sökväg till en virtuell resurs. |
| CreateObjRef(Type) |
Skapar ett objekt som innehåller all relevant information som krävs för att generera en proxy som används för att kommunicera med ett fjärrobjekt. (Ärvd från MarshalByRefObject) |
| DirectoryExists(String) |
Hämtar ett värde som anger om det finns en katalog i det virtuella filsystemet. |
| Equals(Object) |
Avgör om det angivna objektet är lika med det aktuella objektet. (Ärvd från Object) |
| FileExists(String) |
Hämtar ett värde som anger om en fil finns i det virtuella filsystemet. |
| GetCacheDependency(String, IEnumerable, DateTime) |
Skapar ett cacheberoende baserat på de angivna virtuella sökvägarna. |
| GetCacheKey(String) |
Returnerar en cachenyckel som ska användas för den angivna virtuella sökvägen. |
| GetDirectory(String) |
Hämtar en virtuell katalog från det virtuella filsystemet. |
| GetFile(String) |
Hämtar en virtuell fil från det virtuella filsystemet. |
| GetFileHash(String, IEnumerable) |
Returnerar en hash för de angivna virtuella sökvägarna. |
| GetHashCode() |
Fungerar som standard-hash-funktion. (Ärvd från Object) |
| GetLifetimeService() |
Hämtar det aktuella livslängdstjänstobjektet som styr livslängdsprincipen för den här instansen. (Ärvd från MarshalByRefObject) |
| GetType() |
Hämtar den aktuella instansen Type . (Ärvd från Object) |
| Initialize() |
Initierar instansen VirtualPathProvider . |
| InitializeLifetimeService() |
Ger objektet VirtualPathProvider en oändlig livslängd genom att förhindra att ett lån skapas. |
| MemberwiseClone() |
Skapar en ytlig kopia av den aktuella Object. (Ärvd från Object) |
| MemberwiseClone(Boolean) |
Skapar en ytlig kopia av det aktuella MarshalByRefObject objektet. (Ärvd från MarshalByRefObject) |
| OpenFile(String) |
Returnerar en dataström från en virtuell fil. |
| ToString() |
Returnerar en sträng som representerar det aktuella objektet. (Ärvd från Object) |