VirtualPathProvider Klass

Definition

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
VirtualPathProvider

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.

  1. Skapa ett exempelprogram på webbservern.

  2. Kopiera källkoden för det anpassade VirtualPathProvider objektet (se nedan) till en fil i programmets App_Code katalog.

  3. Kopiera källkoden för det anpassade VirtualDirectory objektet (se avsnittet Exempel i VirtualDirectory avsnittet klassöversikt) till en fil i programmets App_Code katalog.

  4. Kopiera källkoden för det anpassade VirtualFile objektet (se avsnittet Exempel i VirtualFile avsnittet klassöversikt) till en fil i programmets App_Code katalog.

  5. Kopiera källkoden AppStart för objektet (se nedan) till en fil i programmets App_Code katalog.

  6. Kopiera XML-data (se nedan) till en fil med namnet XMLData.xml till en fil i programmets App_Data katalog.

  7. default.aspx Kopiera filen (se nedan) till rotkatalogen för exempelprogrammet. Använd en webbläsare för att öppna default.aspx filen 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_Theme tema 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_GlobalResourcesalla App_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.

  • 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.
    

    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)

Gäller för