VirtualPathProvider Třída

Definice

Poskytuje sadu metod, které webové aplikaci umožňují načítat prostředky z virtuálního systému souborů.

public ref class VirtualPathProvider abstract : MarshalByRefObject
public abstract class VirtualPathProvider : MarshalByRefObject
type VirtualPathProvider = class
    inherit MarshalByRefObject
Public MustInherit Class VirtualPathProvider
Inherits MarshalByRefObject
Dědičnost
VirtualPathProvider

Příklady

Následující příklad kódu je VirtualPathProvider implementace třídy, která vytvoří virtuální systém souborů pomocí informací uložených v objektu DataSet . Příklad kódu funguje s příklady kódu pro VirtualFile třídy a VirtualDirectory poskytuje virtuální prostředky z úložiště dat načteného do objektu DataSet .

Tento příklad má čtyři části: implementace třídy VirtualPathProvider, datový soubor XML použitý k naplnění objektu DataSet, objekt AppStart obsahující metodu AppInitialize sloužící k registraci třídy VirtualPathProvider v systému kompilace a ASP.NET stránce, která poskytuje odkazy na virtuální soubory.

Pokud chcete tento ukázkový kód použít v aplikaci, postupujte takto.

  1. Vytvořte na webovém serveru ukázkovou aplikaci.

  2. Zkopírujte zdrojový kód vlastního objektu VirtualPathProvider (viz níže) do souboru v adresáři aplikace App_Code .

  3. Zkopírujte zdrojový kód pro vlastní VirtualDirectory objekt (viz část Příklad v tématu přehledu VirtualDirectory třídy) do souboru v adresáři aplikace App_Code .

  4. Zkopírujte zdrojový kód pro vlastní VirtualFile objekt (viz část Příklad v tématu přehledu VirtualFile třídy) do souboru v adresáři aplikace App_Code .

  5. Zkopírujte zdrojový kód objektu AppStart (viz níže) do souboru v adresáři aplikace App_Code .

  6. Zkopírujte data XML (viz níže) do souboru s názvem XMLData.xml do souboru v adresáři aplikace App_Data .

  7. default.aspx Zkopírujte soubor (viz níže) do kořenového adresáře ukázkové aplikace. Otevřete soubor pomocí webového prohlížeče default.aspx a kliknutím na odkazy na stránce zobrazte obsah virtuálních souborů.

První příklad je vlastní VirtualPathProvider třída. Metody DirectoryExists jsou FileExists přepsány, aby indikovaly, zda je požadovaný adresář v systému virtuálních souborů. Metody GetDirectory a GetFile metody se přepíše tak, aby vrátily vlastní VirtualDirectory instance a VirtualFile instance obsahující informace z virtuálního systému souborů.

Třída také poskytuje metodu GetVirtualData používanou třídami VirtualDirectoryVirtualFile pro přístup k objektu DataSet obsahujícímu data virtuálního systému souborů. V produkční implementaci by se tato metoda obvykle implementovala v obchodním objektu zodpovědném za interakci s úložištěm dat.

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

Druhý příklad je datový soubor XML použitý k naplnění objektu DataSet vráceného vlastním VirtualPathProvider objektem. Tato data XML se používají k předvedení použití VirtualPathProviderVirtualDirectoryVirtualFile a objektů k načtení dat z externích dat a nejsou určeny k reprezentaci úložiště dat v produkční kvalitě.

<?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>

Třetí příklad poskytuje AppStart objekt, který obsahuje metodu AppInitialize . Tato metoda se volá během inicializace ASP.NET aplikace k provedení jakékoli vlastní inicializace požadované. V tomto případě zaregistruje vlastní objekt VirtualPathProvider v systému sestavení 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

Poslední příklad je stránka ASP.NET, která obsahuje odkazy na virtuální soubory obsažené ve virtuálním systému souborů.


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

Poznámky

Třída VirtualPathProvider poskytuje sadu metod pro implementaci virtuálního systému souborů pro webovou aplikaci. Ve virtuálním systému souborů se soubory a adresáře spravují jiným úložištěm dat, než je systém souborů poskytovaný operačním systémem serveru. Můžete například použít virtuální systém souborů k ukládání obsahu do SQL Server databáze.

Všechny soubory zpracovávané na vyžádání můžete uložit ve virtuálním systému souborů. Sem patří:

  • ASP.NET stránky, stránky předlohy, uživatelské ovládací prvky a další objekty.

  • Standardní webové stránky s rozšířeními, jako jsou .htm a .jpg.

  • Jakékoli vlastní rozšíření namapované na BuildProvider instanci.

  • Libovolný pojmenovaný motiv ve App_Theme složce

Nelze ukládat ASP.NET složek aplikací nebo souborů, které generují sestavení na úrovni aplikace ve virtuálním systému souborů. Sem patří:

  • Soubor Global.asax.

  • Web.config soubory.

  • Datové soubory mapy webu používané nástrojem XmlSiteMapProvider.

  • Adresáře, které obsahují sestavení aplikace nebo které generují sestavení aplikace: Bin, App_Code, App_GlobalResources, libovolná App_LocalResources.

  • Složka dat aplikace, App_Data.

Note

Pokud je web předkompilován pro nasazení, obsah poskytovaný VirtualPathProvider instancí není zkompilován a předkompilovaný web nepoužívá žádné VirtualPathProvider instance.

Registrace nástroje VirtualPathProvider

Vlastní instance VirtualPathProvider by měla být registrována v systému kompilace ASP.NET pomocí metody HostingEnvironment.RegisterVirtualPathProvider předtím, než webová aplikace provede analýzu nebo kompilaci stránky.

Instance je obvykle VirtualPathProvider registrována v metodě definované v AppInitializeApp_Code adresáři nebo během Application_Start události v Global.asax souboru. Příklad registrace VirtualPathProvider instance v metodě najdete v AppInitialize části Příklad.

Instanci můžete zaregistrovat VirtualPathProvider během jiných událostí, ale stránky kompilované a uložené v mezipaměti před VirtualPathProvider registrací instance nebudou neplatné, i když by nová VirtualPathProvider instance nyní poskytla zdroj pro dříve kompilovanou stránku.

Poznámky pro implementátory

Když dědíte z VirtualPathProvider, musíte přepsat následující členy:

Pokud vaše vlastní VirtualPathProvider třída podporuje adresáře ve virtuálním systému souborů, musíte přepsat následující členy.

Konstruktory

Name Description
VirtualPathProvider()

Inicializuje třídu pro použití zděděnou instancí třídy. Tento konstruktor lze volat pouze zděděnou třídou.

Vlastnosti

Name Description
Previous

Získá odkaz na dříve zaregistrovaný VirtualPathProvider objekt v systému kompilace.

Metody

Name Description
CombineVirtualPaths(String, String)

Kombinuje základní cestu s relativní cestou k vrácení úplné cesty k virtuálnímu prostředku.

CreateObjRef(Type)

Vytvoří objekt, který obsahuje všechny relevantní informace potřebné k vygenerování proxy serveru sloužícího ke komunikaci se vzdáleným objektem.

(Zděděno od MarshalByRefObject)
DirectoryExists(String)

Získá hodnotu, která určuje, zda adresář existuje ve virtuálním systému souborů.

Equals(Object)

Určuje, zda je zadaný objekt roven aktuálnímu objektu.

(Zděděno od Object)
FileExists(String)

Získá hodnotu, která určuje, zda soubor existuje ve virtuálním systému souborů.

GetCacheDependency(String, IEnumerable, DateTime)

Vytvoří závislost mezipaměti na základě zadaných virtuálních cest.

GetCacheKey(String)

Vrátí klíč mezipaměti, který se použije pro zadanou virtuální cestu.

GetDirectory(String)

Získá virtuální adresář z virtuálního systému souborů.

GetFile(String)

Získá virtuální soubor z virtuálního systému souborů.

GetFileHash(String, IEnumerable)

Vrátí hodnotu hash zadaných virtuálních cest.

GetHashCode()

Slouží jako výchozí funkce hash.

(Zděděno od Object)
GetLifetimeService()
Zastaralé.

Načte objekt služby aktuální životnosti, který řídí zásady životnosti pro tuto instanci.

(Zděděno od MarshalByRefObject)
GetType()

Získá Type aktuální instance.

(Zděděno od Object)
Initialize()

Inicializuje VirtualPathProvider instanci.

InitializeLifetimeService()

Poskytuje objekt VirtualPathProvider nekonečné životnosti tím, že brání vytvoření zapůjčení.

MemberwiseClone()

Vytvoří mělkou kopii aktuálního Object.

(Zděděno od Object)
MemberwiseClone(Boolean)

Vytvoří mělkou kopii aktuálního MarshalByRefObject objektu.

(Zděděno od MarshalByRefObject)
OpenFile(String)

Vrátí datový proud z virtuálního souboru.

ToString()

Vrátí řetězec, který představuje aktuální objekt.

(Zděděno od Object)

Platí pro