Sdílet prostřednictvím


VirtualPathProvider Třída

Definice

Poskytuje sadu metod, které webové aplikaci umožňují načíst 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 pracuje s příklady kódu pro VirtualFile třídy a VirtualDirectory k poskytování virtuálních prostředků z úložiště dat, které je načteno do objektu DataSet .

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

Chcete-li použít tento vzorový kód v aplikaci, postupujte podle těchto kroků.

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

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

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

  4. Zkopírujte zdrojový kód vlastního VirtualFile objektu (viz část Příklad v VirtualFile tématu s přehledem 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 ve webovém default.aspx prohlížeči a kliknutím na odkazy na stránce zobrazte obsah virtuálních souborů.

Prvním příkladem je vlastní VirtualPathProvider třída. Metody DirectoryExists a FileExists jsou přepsány, aby bylo uvedeno, zda je požadovaný adresář přítomen ve virtuálním systému souborů. Metody GetDirectory a GetFile jsou přepsány tak, aby vracely vlastní VirtualDirectory instance a VirtualFile obsahující informace z virtuálního systému souborů.

Třída také poskytuje metodu GetVirtualData používanou třídami VirtualDirectory a VirtualFile pro přístup k objektu DataSet obsahujícímu data virtuálního systému souborů. V produkční implementaci by tato metoda obvykle byla implementována 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ým příkladem je datový soubor XML sloužící k naplnění objektu DataSet vráceného vlastním VirtualPathProvider objektem. Tato data XML slouží k předvedení použití VirtualPathProviderobjektů , VirtualDirectorya VirtualFile k načtení dat z externích dat a není určena k reprezentaci úložiště dat produkční kvality.

<?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 je volána během inicializace ASP.NET aplikace k provedení jakékoli vlastní inicializace požadované. V tomto případě zaregistruje vlastní VirtualPathProvider objekt 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ím příkladem 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ů jsou soubory a adresáře spravovány jiným úložištěm dat, než je systém souborů poskytovaný operačním systémem serveru. Virtuální systém souborů můžete například použít k ukládání obsahu do SQL Server databáze.

Do virtuálního systému souborů můžete uložit jakýkoli soubor, který se zpracuje na vyžádání. 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í mapované na BuildProvider instanci.

  • Libovolný pojmenovaný motiv ve App_Theme složce

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

  • Soubor Global.asax.

  • Web.config souborů.

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

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

  • Složka dat aplikace . App_Data

Poznámka

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

Registrace VirtualPathProvider

Vlastní VirtualPathProvider instance by měla být zaregistrována v systému kompilace ASP.NET pomocí HostingEnvironment.RegisterVirtualPathProvider metody před provedením jakékoli analýzy nebo kompilace stránky webovou aplikací.

Instance VirtualPathProvider je obvykle registrována v AppInitialize metodě definované v adresáři App_Code 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 zkompilované a uložené v mezipaměti před registrací instance nebudou VirtualPathProvider zneplatněné, i když by nová VirtualPathProvider instance nyní poskytovala zdroj pro dříve zkompilovanou 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

VirtualPathProvider()

Inicializuje třídu pro použití zděděnou instancí třídy. Tento konstruktor může být volána pouze zděděnou třídou.

Vlastnosti

Previous

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

Metody

CombineVirtualPaths(String, String)

Kombinuje základní cestu s relativní cestou, aby se vrátila úplná cesta k virtuálnímu prostředku.

CreateObjRef(Type)

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

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

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

Equals(Object)

Určí, zda se zadaný objekt rovná aktuálnímu objektu.

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

Získá hodnotu, která označ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 má použít 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í hashovací funkce.

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

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

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

Type Získá z aktuální instance.

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

Inicializuje VirtualPathProvider instanci.

InitializeLifetimeService()

Dává objektu VirtualPathProvider nekonečnou životnost tím, že zabrání vytvoření zapůjčení.

MemberwiseClone()

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

(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