VirtualPathProvider Kelas
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
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
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
Untuk menggunakan kode sampel ini dalam aplikasi, ikuti langkah-langkah ini.
Buat aplikasi sampel di server Web Anda.
Salin kode sumber untuk objek kustom VirtualPathProvider (lihat di bawah) ke dalam file di direktori aplikasi
App_Code.Salin kode sumber untuk objek kustom VirtualDirectory (lihat bagian Contoh di VirtualDirectory topik gambaran umum kelas) ke dalam file di direktori aplikasi
App_Code.Salin kode sumber untuk objek kustom VirtualFile (lihat bagian Contoh di VirtualFile topik gambaran umum kelas) ke dalam file di direktori aplikasi
App_Code.Salin kode sumber untuk
AppStartobjek (lihat di bawah) ke dalam file di direktori aplikasiApp_Code.Salin data XML (lihat di bawah) ke dalam file bernama
XMLData.xmlke dalam file di direktori aplikasiApp_Data.default.aspxSalin file (lihat di bawah) ke direktori akar aplikasi sampel. Gunakan browser Web untuk membukadefault.aspxfile, 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_Themefolder .
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 punApp_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.
-
Catatan: Jika sistem file virtual Anda akan berisi tema untuk situs Web (dengan membuat direktori virtual
App_Themes), kelas kustom VirtualPathProvider Anda harus mendukung direktori.Kelas kustom VirtualPathProvider bekerja dengan kelas yang berasal dari VirtualFile kelas dan VirtualDirectory . Anda harus menerapkan kelas turunan dari jenis ini untuk memberikan informasi file dan direktori dari sistem file virtual Anda. Untuk contoh implementasi kustom VirtualFile , lihat bagian VirtualFile Contoh topik gambaran umum kelas. Untuk contoh implementasi kustom VirtualDirectory , lihat bagian VirtualDirectory Contoh topik gambaran umum kelas.
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) |