VirtualPathProvider Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Предоставляет набор методов, позволяющих веб-приложению извлекать ресурсы из виртуальной файловой системы.
public ref class VirtualPathProvider abstract : MarshalByRefObject
public abstract class VirtualPathProvider : MarshalByRefObject
type VirtualPathProvider = class
inherit MarshalByRefObject
Public MustInherit Class VirtualPathProvider
Inherits MarshalByRefObject
- Наследование
Примеры
Следующий пример кода — это реализация класса, которая создает виртуальную файловую VirtualPathProvider систему с помощью сведений, хранящихся в объекте DataSet . Пример кода работает с примерами кода для и VirtualFile классов для VirtualDirectory предоставления виртуальных ресурсов из хранилища данных, загруженного в DataSet объект.
В этом примере есть четыре части: реализация класса VirtualPathProvider, XML-файл данных, используемый для заполнения объекта DataSet, объекта AppStart, содержащего метод AppInitialize, используемый для регистрации класса VirtualPathProvider в системе компиляции, а также страница ASP.NET со ссылками на виртуальные файлы.
Чтобы использовать этот пример кода в приложении, выполните следующие действия.
Создайте пример приложения на веб-сервере.
Скопируйте исходный код для пользовательского VirtualPathProvider объекта (см. ниже) в файл в каталоге приложения
App_Code.Скопируйте исходный код для пользовательского VirtualDirectory объекта (см. раздел "Пример" в VirtualDirectory разделе обзора класса) в файл в каталоге приложения
App_Code.Скопируйте исходный код для пользовательского VirtualFile объекта (см. раздел "Пример" в VirtualFile разделе обзора класса) в файл в каталоге приложения
App_Code.Скопируйте исходный код объекта
AppStart(см. ниже) в файл в каталоге приложенияApp_Code.Скопируйте XML-данные (см. ниже) в файл с именем
XMLData.xmlв файл в каталоге приложенияApp_Data.default.aspxСкопируйте файл (см. ниже) в корневой каталог примера приложения. Откройте файл с помощью веб-браузераdefault.aspx, а затем щелкните ссылки на странице, чтобы просмотреть содержимое виртуальных файлов.
Первый пример — это пользовательский VirtualPathProvider класс. DirectoryExists Методы FileExists переопределяются, чтобы указать, присутствует ли запрошенный каталог в виртуальной файловой системе. Методы GetDirectory переопределяются для возврата пользовательских GetFile и VirtualDirectoryVirtualFile экземпляров, содержащих сведения из виртуальной файловой системы.
Класс также предоставляет метод, используемый классом GetVirtualData и VirtualDirectory классами VirtualFile для доступа к DataSet объекту, содержаму данные виртуальной файловой системы. В рабочей реализации этот метод обычно реализуется в бизнес-объекте, ответственном за взаимодействие с хранилищем данных.
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
Второй пример — XML-файл данных, используемый для заполнения DataSet объекта, возвращаемого пользовательским VirtualPathProvider объектом. Эти XML-данные используются для демонстрации с помощью VirtualPathProviderVirtualDirectoryобъектов и VirtualFile объектов для извлечения данных из внешних данных и не предназначены для представления хранилища данных рабочего качества.
<?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>
Третий AppStart пример предоставляет объект, содержащий AppInitialize метод. Этот метод вызывается во время инициализации приложения ASP.NET для выполнения любой пользовательской инициализации. В этом случае он регистрирует пользовательский объект VirtualPathProvider в системе сборки 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
Последний пример — это страница ASP.NET, содержащая ссылки на виртуальные файлы, содержащиеся в виртуальной файловой системе.
<%@ 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>
Комментарии
Класс VirtualPathProvider предоставляет набор методов для реализации виртуальной файловой системы для веб-приложения. В виртуальной файловой системе файлы и каталоги управляются хранилищем данных, кроме файловой системы, предоставляемой операционной системой сервера. Например, можно использовать виртуальную файловую систему для хранения содержимого в базе данных SQL Server.
Вы можете хранить любой файл, обрабатываемый по запросу, в виртуальной файловой системе. Сюда входит следующее:
ASP.NET страницы, главные страницы, пользовательские элементы управления и другие объекты.
Стандартные веб-страницы с расширениями, такими как .htm и .jpg.
Любое пользовательское расширение, сопоставленное с экземпляром BuildProvider .
Любая именованной тема в папке
App_Theme.
Нельзя хранить ASP.NET папки приложения или файлы, создающие сборки уровня приложения в виртуальной файловой системе. Сюда входит следующее:
Файл Global.asax.
Web.config файлы.
Файлы данных карты сайта, используемые файлом XmlSiteMapProviderданных .
Каталоги, содержащие сборки приложений или создающие сборки приложений:
Bin, ,App_CodeApp_GlobalResourcesлюбыеApp_LocalResources.Папка данных приложения,
App_Data.
Note
Если веб-сайт предварительно компилируется для развертывания, содержимое, предоставленное VirtualPathProvider экземпляром, не компилируется, а экземпляры не VirtualPathProvider используются предварительно компилируемым сайтом.
Регистрация VirtualPathProvider
Пользовательский экземпляр VirtualPathProvider должен быть зарегистрирован в системе компиляции ASP.NET с помощью метода HostingEnvironment.RegisterVirtualPathProvider перед выполнением любого анализа страницы или компиляции веб-приложением.
Как правило, VirtualPathProvider экземпляр регистрируется в методе AppInitialize , определенном в App_Code каталоге, или во время Application_Start события в Global.asax файле. Пример регистрации VirtualPathProvider экземпляра в методе AppInitialize см. в разделе "Пример".
Вы можете зарегистрировать VirtualPathProvider экземпляр во время других событий, но страницы, скомпилированные и кэшированные до регистрации экземпляра VirtualPathProvider , не будут недействительными, даже если новый VirtualPathProvider экземпляр теперь предоставит источник для ранее скомпилированной страницы.
Примечания для тех, кто реализует этот метод
При наследовании от VirtualPathProviderних необходимо переопределить следующие элементы:
Если пользовательский VirtualPathProvider класс поддерживает каталоги в виртуальной файловой системе, необходимо переопределить следующие члены.
-
Примечание. Если виртуальная файловая система будет содержать темы для веб-сайта (создав виртуальный
App_Themesкаталог), пользовательский VirtualPathProvider класс должен поддерживать каталоги.Пользовательский VirtualPathProvider класс работает с классами, производными от VirtualFile и VirtualDirectory классов. Для предоставления сведений о файлах и каталогах из виртуальной файловой системы следует реализовать производные классы из этих типов. Пример пользовательской VirtualFile реализации см. в разделе VirtualFile "Пример" раздела обзора класса. Пример пользовательской VirtualDirectory реализации см. в разделе VirtualDirectory "Пример" раздела обзора класса.
Конструкторы
| Имя | Описание |
|---|---|
| VirtualPathProvider() |
Инициализирует класс для использования наследуемым экземпляром класса. Этот конструктор может вызываться только унаследованным классом. |
Свойства
| Имя | Описание |
|---|---|
| Previous |
Возвращает ссылку на ранее зарегистрированный VirtualPathProvider объект в системе компиляции. |
Методы
| Имя | Описание |
|---|---|
| CombineVirtualPaths(String, String) |
Объединяет базовый путь с относительным путем для возврата полного пути к виртуальному ресурсу. |
| CreateObjRef(Type) |
Создает объект, содержащий все соответствующие сведения, необходимые для создания прокси-сервера, используемого для взаимодействия с удаленным объектом. (Унаследовано от MarshalByRefObject) |
| DirectoryExists(String) |
Возвращает значение, указывающее, существует ли каталог в виртуальной файловой системе. |
| Equals(Object) |
Определяет, равен ли указанный объект текущему объекту. (Унаследовано от Object) |
| FileExists(String) |
Возвращает значение, указывающее, существует ли файл в виртуальной файловой системе. |
| GetCacheDependency(String, IEnumerable, DateTime) |
Создает зависимость кэша на основе указанных виртуальных путей. |
| GetCacheKey(String) |
Возвращает ключ кэша, используемый для указанного виртуального пути. |
| GetDirectory(String) |
Возвращает виртуальный каталог из виртуальной файловой системы. |
| GetFile(String) |
Получает виртуальный файл из виртуальной файловой системы. |
| GetFileHash(String, IEnumerable) |
Возвращает хэш указанных виртуальных путей. |
| GetHashCode() |
Служит хэш-функцией по умолчанию. (Унаследовано от Object) |
| GetLifetimeService() |
Устаревшие..
Извлекает текущий объект службы времени существования, который управляет политикой времени существования для этого экземпляра. (Унаследовано от MarshalByRefObject) |
| GetType() |
Возвращает Type текущего экземпляра. (Унаследовано от Object) |
| Initialize() |
Инициализирует VirtualPathProvider экземпляр. |
| InitializeLifetimeService() |
VirtualPathProvider Дает объекту бесконечное время существования, предотвращая создание аренды. |
| MemberwiseClone() |
Создает неглубокую копию текущей Object. (Унаследовано от Object) |
| MemberwiseClone(Boolean) |
Создает неглубокую копию текущего MarshalByRefObject объекта. (Унаследовано от MarshalByRefObject) |
| OpenFile(String) |
Возвращает поток из виртуального файла. |
| ToString() |
Возвращает строку, представляющую текущий объект. (Унаследовано от Object) |