VirtualPathProvider Класс

Определение

Предоставляет набор методов, позволяющих веб-приложению извлекать ресурсы из виртуальной файловой системы.

public ref class VirtualPathProvider abstract : MarshalByRefObject
public abstract class VirtualPathProvider : MarshalByRefObject
type VirtualPathProvider = class
    inherit MarshalByRefObject
Public MustInherit Class VirtualPathProvider
Inherits MarshalByRefObject
Наследование
VirtualPathProvider

Примеры

Следующий пример кода представляет собой VirtualPathProvider реализацию класса, которая создает виртуальную файловую систему с использованием сведений, хранящихся в объекте DataSet . Этот пример кода работает с примерами кода для VirtualFile классов и VirtualDirectory для предоставления виртуальных ресурсов из хранилища данных, загружаемого DataSet в объект .

Этот пример состоит из четырех частей: VirtualPathProvider реализация класса, XML-файл данных, используемый AppStart для заполнения DataSet объекта, объект, содержащий метод, используемый AppInitialize для регистрации VirtualPathProvider класса в системе компиляции, и страница ASP.NET со ссылками на виртуальные файлы.

Чтобы использовать этот пример кода в приложении, выполните следующие действия.

  1. Создайте пример приложения на веб-сервере.

  2. Скопируйте исходный код пользовательского VirtualPathProvider объекта (см. ниже) в файл в каталоге App_Code приложения.

  3. Скопируйте исходный код пользовательского VirtualDirectory объекта (см. раздел Пример в обзоре VirtualDirectory класса) в файл в каталоге App_Code приложения.

  4. Скопируйте исходный код пользовательского VirtualFile объекта (см. раздел Пример в обзоре VirtualFile класса) в файл в каталоге App_Code приложения.

  5. Скопируйте исходный код объекта AppStart (см. ниже) в файл в каталоге App_Code приложения.

  6. Скопируйте XML-данные (см. ниже) в файл с именем XMLData.xml в файл в каталоге App_Data приложения.

  7. default.aspx Скопируйте файл (см. ниже) в корневой каталог примера приложения. Откройте файл в веб-браузере default.aspx , а затем щелкните ссылки на странице, чтобы просмотреть содержимое виртуальных файлов.

Первый пример — пользовательский VirtualPathProvider класс. Методы DirectoryExists и FileExists переопределяются, чтобы указать, присутствует ли запрошенный каталог в виртуальной файловой системе. Методы GetDirectory и GetFile переопределяются для возврата пользовательских VirtualDirectory экземпляров и VirtualFile , содержащих сведения из виртуальной файловой системы.

Класс также предоставляет метод, используемый 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-данные используются для демонстрации VirtualPathProviderиспользования объектов , VirtualDirectoryи 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_Code, App_GlobalResources, любой App_LocalResources.

  • Папка данных приложения , App_Data.

Примечание

Если веб-сайт предварительно скомпилирован для развертывания, содержимое, предоставленное экземпляром VirtualPathProvider , не компилируется, и экземпляры не VirtualPathProvider используются предварительно скомпилированным сайтом.

Регистрация VirtualPathProvider

Пользовательский VirtualPathProvider экземпляр должен быть зарегистрирован в системе компиляции ASP.NET с помощью HostingEnvironment.RegisterVirtualPathProvider метода , прежде чем веб-приложением будет выполняться синтаксический анализ или компиляцию страниц.

Как правило, экземпляр регистрируется в методеAppInitialize, VirtualPathProvider определенном в каталоге App_CodeApplication_Start, или во время события в Global.asax файле. Пример регистрации экземпляра VirtualPathProvider в методе см. в AppInitialize разделе Пример.

Экземпляр можно зарегистрировать VirtualPathProvider во время других событий, но страницы, скомпилированные и кэшированные до VirtualPathProvider регистрации экземпляра, не будут недействительными, даже если новый VirtualPathProvider экземпляр теперь будет предоставлять источник для ранее скомпилированной страницы.

Примечания для тех, кто реализует этот метод

При наследовании от VirtualPathProviderнеобходимо переопределить следующие члены:

Если пользовательский VirtualPathProvider класс поддерживает каталоги в виртуальной файловой системе, необходимо переопределить следующие члены.

  • DirectoryExists(String)

  • GetDirectory(String)

    Примечание. Если виртуальная файловая система будет содержать темы для веб-сайта (путем создания виртуального 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)

Применяется к