このドキュメントはアーカイブされており、メンテナンスされていません。

VirtualPathProvider クラス

Web アプリケーションによって仮想ファイル システムのリソースを取得できるようにする一連のメソッドが用意されています。

名前空間: System.Web.Hosting
アセンブリ: System.Web (system.web.dll 内)

public abstract class VirtualPathProvider : MarshalByRefObject
public abstract class VirtualPathProvider extends MarshalByRefObject
public abstract class VirtualPathProvider extends MarshalByRefObject
適用できません。

VirtualPathProvider クラスには、Web アプリケーションの仮想ファイル システムを実装するための一連のメソッドが用意されています。仮想ファイル システムでは、サーバーのオペレーティング システムで提供されるファイル システムとは別のデータ ストアでファイルおよびディレクトリが管理されます。たとえば、仮想ファイル システムを使用して、SQL Server データベースの内容を格納できます。

要求に応じて処理される任意のファイルを仮想ファイル システムに格納できます。これには、次のものが含まれます。

  • ASP.NET ページ、マスタ ページ、ユーザー コントロール、およびその他のオブジェクト。

  • .htm、.jpg などの拡張子を持つ標準の Web ページ。

  • BuildProvider インスタンスに割り当てられたカスタム拡張子。

  • App_Theme フォルダ内の名前付きテーマ。

アプリケーション レベルのアセンブリを生成する ASP.NET アプリケーション フォルダやファイルは、仮想ファイル システムに格納できません。これには、次のものが含まれます。

  • Global.asax ファイル。

  • Web.config ファイル。

  • XmlSiteMapProvider で使用されるサイト マップ データ ファイル。

  • アプリケーション アセンブリを格納または生成するディレクトリ。つまり、BinApp_CodeApp_GlobalResourcesApp_LocalResources の各ディレクトリ。

  • アプリケーション データ フォルダの App_Data

メモメモ :

Web サイトが配置のためにプリコンパイルされている場合、VirtualPathProvider インスタンスによって提供される内容はコンパイルされません。プリコンパイル済みサイトでは VirtualPathProvider インスタンスは使用されません。

VirtualPathProvider の登録

VirtualPathProvider カスタム インスタンスは、Web アプリケーションによるページ解析とコンパイルの前に、HostingEnvironment.RegisterVirtualPathProvider メソッドを使用して ASP.NET コンパイル システムに登録する必要があります。

通常、VirtualPathProvider インスタンスは、App_Code ディレクトリに定義されている AppInitialize メソッドで登録されるか、または Global.asax ファイルに定義されている Application_Start イベント時に登録されます。AppInitialize メソッドで VirtualPathProvider インスタンスを登録する例については、「例」を参照してください。

他のイベント時に VirtualPathProvider インスタンスを登録できますが、以前にコンパイル済みのページのソースが新しい VirtualPathProvider インスタンスによって提供されても、VirtualPathProvider インスタンスが登録される前にコンパイルおよびキャッシュされたページは無効になりません。

継承元へのメモ : VirtualPathProvider から継承する場合は、次のメンバをオーバーライドする必要があります。

VirtualPathProvider カスタム クラスで仮想ファイル システムのディレクトリをサポートする場合は、次のメンバをオーバーライドする必要があります。
メモメモ :

App_Themes 仮想 ディレクトリを作成することにより、仮想ファイル システムに Web サイトのテーマを格納する場合は、VirtualPathProvider カスタム クラスでディレクトリをサポートする必要があります。

VirtualPathProvider カスタム クラスは、VirtualFile クラスおよび VirtualDirectory クラスから派生したクラスと連携して動作します。仮想ファイル システムのファイル情報およびディレクトリ情報を提供するには、これらの型の派生クラスを実装する必要があります。カスタム VirtualFile の実装例については、VirtualFile クラスの概要のトピックで「例」を参照してください。カスタム VirtualDirectory の実装例については、VirtualDirectory クラスの概要のトピックで「例」を参照してください。

DataSet オブジェクトに格納されている情報を使用して仮想ファイル システムを作成する VirtualPathProvider クラスの実装例を次のコード例に示します。このコード例は、VirtualFile クラスおよび VirtualDirectory クラスのコード例と連携して、DataSet オブジェクトに読み込まれたデータ ストアから仮想リソースを返します。

この例は、4 つの部分で構成されます。最初に VirtualPathProvider クラスの実装例を示します。次に、DataSet オブジェクトを設定するために使用される XML データ ファイルを示します。さらに、VirtualPathProvider クラスをコンパイル システムに登録するために使用される AppInitialize メソッドが定義されている AppStart オブジェクトを示します。最後に、仮想ファイルへのリンクを提供する ASP.NET ページを示します。

このサンプル コードをアプリケーションで使用するには、次の手順を実行します。

  1. Web サーバーでサンプル アプリケーションを作成します。

  2. VirtualPathProvider カスタム オブジェクト (下記を参照) のソース コードを、アプリケーションの App_Code ディレクトリ内にあるファイルにコピーします。

  3. VirtualDirectory カスタム オブジェクトのソース コードを、アプリケーションの App_Code ディレクトリ内にあるファイルにコピーします。このソース コードについては、VirtualDirectory クラスの概要のトピックで「例」を参照してください。

  4. VirtualFile カスタム オブジェクトのソース コードを、アプリケーションの App_Code ディレクトリ内にあるファイルにコピーします。このソース コードについては、VirtualFile クラスの概要のトピックで「例」を参照してください。

  5. AppStart オブジェクトのソース コード (下記を参照) を、アプリケーションの App_Code ディレクトリ内にあるファイルにコピーします。

  6. XML データ (下記を参照) をアプリケーションの App_Data ディレクトリ内にある XMLData.xml という名前のファイルにコピーします。

  7. default.aspx ファイル (下記を参照) をサンプル アプリケーションのルート ディレクトリにコピーします。Web ブラウザを使用して default.aspx ファイルを開き、ページ上のリンクをクリックして仮想ファイルの内容を表示します。

最初の例は、VirtualPathProvider カスタム クラスです。DirectoryExists メソッドおよび FileExists メソッドをオーバーライドして、要求されたディレクトリが仮想ファイル システム内に存在するかどうかを示します。GetDirectory メソッドおよび GetFile メソッドをオーバーライドして、仮想ファイル システムの情報を格納している VirtualDirectory インスタンスおよび VirtualFile インスタンスを返します。

このクラスは、VirtualDirectory クラスおよび VirtualFile クラスで使用される GetVirtualData メソッドも提供します。これにより、仮想ファイル システムのデータを格納している 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);
    }
  }
  

2 番目の例は、VirtualPathProvider カスタム オブジェクトによって返された DataSet オブジェクトを設定するために使用される XML データ ファイルを示しています。この 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>

3 番目の例では、AppInitialize メソッドが格納されている AppStart オブジェクトを示します。このメソッドは、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);
    } 
  }
}

最後の例では、仮想ファイル システムに格納されている仮想ファイルへのリンクを含む 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>

  • AspNetHostingPermission  (ホスト環境での動作に必要なアクセス許可)。要求値 : LinkDemand。アクセス許可値 : Medium
  • AspNetHostingPermission  (ホスト環境での動作に必要なアクセス許可)。要求値 : InheritanceDemand。アクセス許可値 : High

System.Object
   System.MarshalByRefObject
    System.Web.Hosting.VirtualPathProvider

この型の public static (Visual Basicでは共有) メンバはすべて,スレッド セーフです。インスタンス メンバの場合は,スレッド セーフであるとは限りません。

Windows 98,Windows Server 2000 SP4,Windows CE,Windows Millennium Edition,Windows Mobile for Pocket PC,Windows Mobile for Smartphone,Windows Server 2003,Windows XP Media Center Edition,Windows XP Professional x64 Edition,Windows XP SP2,Windows XP Starter Edition

Microsoft .NET Framework 3.0 は Windows Vista,Microsoft Windows XP SP2,および Windows Server 2003 SP1 でサポートされています。

.NET Framework

サポート対象 : 3.0,2.0
表示: