VirtualPathProvider Kelas

Definisi

Menyediakan sekumpulan metode yang memungkinkan aplikasi Web untuk mengambil sumber daya dari sistem file virtual.

public ref class VirtualPathProvider abstract : MarshalByRefObject
public abstract class VirtualPathProvider : MarshalByRefObject
type VirtualPathProvider = class
    inherit MarshalByRefObject
Public MustInherit Class VirtualPathProvider
Inherits MarshalByRefObject
Warisan
VirtualPathProvider

Contoh

Contoh kode berikut adalah VirtualPathProvider implementasi kelas yang membuat sistem file virtual menggunakan informasi yang DataSet disimpan dalam objek. Contoh kode bekerja dengan contoh kode untuk VirtualFile kelas dan VirtualDirectory untuk menyediakan sumber daya virtual dari penyimpanan data yang dimuat ke dalam DataSet objek.

Contoh ini memiliki empat bagian: implementasi kelas , file data XML yang digunakan untuk mengisi objek , objek yang berisi metode /> dengan sistem kompilasi, dan halaman ASP.NET yang menyediakan tautan ke file virtual.

Untuk menggunakan kode sampel ini dalam aplikasi, ikuti langkah-langkah ini.

  1. Buat aplikasi sampel di server Web Anda.

  2. Salin kode sumber untuk objek kustom VirtualPathProvider (lihat di bawah) ke dalam file di direktori aplikasi App_Code .

  3. Salin kode sumber untuk objek kustom VirtualDirectory (lihat bagian Contoh di VirtualDirectory topik gambaran umum kelas) ke dalam file di direktori aplikasi App_Code .

  4. Salin kode sumber untuk objek kustom VirtualFile (lihat bagian Contoh di VirtualFile topik gambaran umum kelas) ke dalam file di direktori aplikasi App_Code .

  5. Salin kode sumber untuk AppStart objek (lihat di bawah) ke dalam file di direktori aplikasi App_Code .

  6. Salin data XML (lihat di bawah) ke dalam file bernama XMLData.xml ke dalam file di direktori aplikasi App_Data .

  7. default.aspx Salin file (lihat di bawah) ke direktori akar aplikasi sampel. Gunakan browser Web untuk membuka default.aspx file, lalu klik tautan di halaman untuk melihat konten file virtual.

Contoh pertama adalah kelas kustom VirtualPathProvider . Metode DirectoryExists dan FileExists ditimpa untuk menunjukkan apakah direktori yang diminta ada dalam sistem file virtual. Metode GetDirectory dan GetFile ditimpa untuk mengembalikan kustom VirtualDirectory dan VirtualFile instans yang berisi informasi dari sistem file virtual.

Kelas ini juga menyediakan metode yang GetVirtualData digunakan oleh VirtualDirectory kelas dan VirtualFile untuk mengakses objek yang DataSet berisi data sistem file virtual. Dalam implementasi produksi, metode ini biasanya akan diterapkan dalam objek bisnis yang bertanggung jawab untuk berinteraksi dengan penyimpanan data.

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

Contoh kedua adalah file data XML yang digunakan untuk mengisi objek yang DataSet dikembalikan oleh objek kustom VirtualPathProvider . Data XML ini digunakan untuk menunjukkan menggunakan VirtualPathProviderobjek , , VirtualDirectorydan VirtualFile untuk mengambil data dari data eksternal dan tidak dimaksudkan untuk mewakili penyimpanan data berkualitas produksi.

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

Contoh ketiga menyediakan AppStart objek yang berisi AppInitialize metode . Metode ini dipanggil selama inisialisasi aplikasi ASP.NET untuk melakukan inisialisasi kustom yang diperlukan. Dalam hal ini, ia mendaftarkan objek VirtualPathProvider kustom dengan sistem build 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

Contoh terakhir adalah halaman ASP.NET yang berisi tautan ke file virtual yang terkandung dalam sistem file 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>

Keterangan

Kelas ini VirtualPathProvider menyediakan serangkaian metode untuk menerapkan sistem file virtual untuk aplikasi Web. Dalam sistem file virtual, file dan direktori dikelola oleh penyimpanan data selain sistem file yang disediakan oleh sistem operasi server. Misalnya, Anda dapat menggunakan sistem file virtual untuk menyimpan konten dalam database SQL Server.

Anda dapat menyimpan file apa pun yang diproses berdasarkan permintaan dalam sistem file virtual. Hal ini mencakup:

  • ASP.NET halaman, halaman master, kontrol pengguna, dan objek lainnya.

  • Halaman Web Standar dengan ekstensi seperti .htm dan .jpg.

  • Ekstensi kustom apa pun yang BuildProvider dipetakan ke instans.

  • Tema bernama apa pun di App_Theme folder .

Anda tidak dapat menyimpan ASP.NET folder aplikasi atau file yang menghasilkan rakitan tingkat aplikasi dalam sistem file virtual. Hal ini mencakup:

  • File Global.asax.

  • Web.config file.

  • File data peta situs yang XmlSiteMapProviderdigunakan oleh .

  • Direktori yang berisi rakitan aplikasi atau yang menghasilkan rakitan aplikasi: Bin, , App_CodeApp_GlobalResources, apa pun App_LocalResources.

  • Folder data aplikasi, App_Data.

Note

Jika situs Web dikompilasi sebelumnya untuk penyebaran, konten yang VirtualPathProvider disediakan oleh instans tidak dikompilasi, dan tidak ada VirtualPathProvider instans yang digunakan oleh situs yang telah dikompilasi sebelumnya.

Mendaftarkan VirtualPathProvider

Instans VirtualPathProvider kustom harus didaftarkan dengan sistem kompilasi ASP.NET dengan menggunakan metode HostingEnvironment.RegisterVirtualPathProvider sebelum penguraian halaman atau kompilasi dilakukan oleh aplikasi Web.

Biasanya, VirtualPathProvider instans terdaftar dalam metode yang AppInitialize ditentukan dalam App_Code direktori, atau selama Application_Start peristiwa dalam Global.asax file. Untuk contoh mendaftarkan VirtualPathProvider instans dalam AppInitialize metode, lihat bagian Contoh.

Anda dapat mendaftarkan VirtualPathProvider instans selama peristiwa lain, tetapi halaman yang dikompilasi dan di-cache sebelum VirtualPathProvider instans terdaftar tidak akan dibatalkan, bahkan jika instans baru VirtualPathProvider sekarang akan menyediakan sumber untuk halaman yang dikompilasi sebelumnya.

Catatan Bagi Implementer

Saat Anda mewarisi dari VirtualPathProvider, Anda harus mengambil alih anggota berikut:

Jika kelas kustom VirtualPathProvider Anda mendukung direktori dalam sistem file virtual, Anda harus mengambil alih anggota berikut.

Konstruktor

Nama Deskripsi
VirtualPathProvider()

Menginisialisasi kelas untuk digunakan oleh instans kelas yang diwariskan. Konstruktor ini hanya dapat dipanggil oleh kelas yang diwariskan.

Properti

Nama Deskripsi
Previous

Mendapatkan referensi ke objek yang terdaftar VirtualPathProvider sebelumnya dalam sistem kompilasi.

Metode

Nama Deskripsi
CombineVirtualPaths(String, String)

Menggabungkan jalur dasar dengan jalur relatif untuk mengembalikan jalur lengkap ke sumber daya virtual.

CreateObjRef(Type)

Membuat objek yang berisi semua informasi relevan yang diperlukan untuk menghasilkan proksi yang digunakan untuk berkomunikasi dengan objek jarak jauh.

(Diperoleh dari MarshalByRefObject)
DirectoryExists(String)

Mendapatkan nilai yang menunjukkan apakah direktori ada di sistem file virtual.

Equals(Object)

Menentukan apakah objek yang ditentukan sama dengan objek saat ini.

(Diperoleh dari Object)
FileExists(String)

Mendapatkan nilai yang menunjukkan apakah file ada di sistem file virtual.

GetCacheDependency(String, IEnumerable, DateTime)

Membuat dependensi cache berdasarkan jalur virtual yang ditentukan.

GetCacheKey(String)

Mengembalikan kunci cache yang akan digunakan untuk jalur virtual yang ditentukan.

GetDirectory(String)

Mendapatkan direktori virtual dari sistem file virtual.

GetFile(String)

Mendapatkan file virtual dari sistem file virtual.

GetFileHash(String, IEnumerable)

Mengembalikan hash dari jalur virtual yang ditentukan.

GetHashCode()

Berfungsi sebagai fungsi hash default.

(Diperoleh dari Object)
GetLifetimeService()
Kedaluwarsa.

Mengambil objek layanan seumur hidup saat ini yang mengontrol kebijakan seumur hidup untuk instans ini.

(Diperoleh dari MarshalByRefObject)
GetType()

Mendapatkan Type instans saat ini.

(Diperoleh dari Object)
Initialize()

Menginisialisasi instans VirtualPathProvider .

InitializeLifetimeService()

VirtualPathProvider Memberi objek masa pakai tak terbatas dengan mencegah sewa dibuat.

MemberwiseClone()

Membuat salinan dangkal dari Objectsaat ini.

(Diperoleh dari Object)
MemberwiseClone(Boolean)

Membuat salinan dangkal objek MarshalByRefObject saat ini.

(Diperoleh dari MarshalByRefObject)
OpenFile(String)

Mengembalikan aliran dari file virtual.

ToString()

Mengembalikan string yang mewakili objek saat ini.

(Diperoleh dari Object)

Berlaku untuk