VirtualFile Klasse

Definition

Stellt ein Dateiobjekt in einer virtuellen Datei oder einem virtuellen Ressourcenbereich dar.

public ref class VirtualFile abstract : System::Web::Hosting::VirtualFileBase
public abstract class VirtualFile : System.Web.Hosting.VirtualFileBase
type VirtualFile = class
    inherit VirtualFileBase
Public MustInherit Class VirtualFile
Inherits VirtualFileBase
Vererbung

Beispiele

Das folgende Codebeispiel ist eine VirtualFile Klassenimplementierung, die Informationen kombiniert, die in einem DataSet Objekt gespeichert sind, mit einer Vorlagendatei, um HTML-Daten zurückzugeben. In diesem Codebeispiel werden die Codebeispiele für die VirtualPathProvider Und VirtualDirectory Klassen verwendet, um virtuelle Ressourcen aus einem Datenspeicher bereitzustellen, der in ein DataSet Objekt geladen wird. Die vollständigen Anweisungen zum Kompilieren und Ausführen des Beispiels finden Sie im Abschnitt "Beispiel" der VirtualPathProvider Klassenübersicht.

Dieses Beispiel enthält drei Teile: die VirtualFile Klassenimplementierung, eine XML-Datendatei zum Auffüllen des DataSet Objekts und die Seitenvorlagendatei.

Das erste Codebeispiel ist eine Implementierung der VirtualFile Klasse. Der Konstruktor verwendet eine Methode für ein benutzerdefiniertes VirtualPathProvider Objekt, um ein DataSet Objekt zurückzugeben. Anschließend wird das DataSet Objekt durchsucht, um die informationen abzurufen, die dem bereitgestellten virtuellen Dateipfad zugeordnet sind. In der Open Methode kombiniert sie die Informationen aus dem DataSet Objekt mit einer Vorlagendatei und gibt die Kombination als Stream Objekt zurück.

using System;
using System.Data;
using System.IO;
using System.Security.Permissions;
using System.Web;
using System.Web.Caching;
using System.Web.Hosting;

namespace Samples.AspNet.CS
{
  [AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)]
  [AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
  public class SampleVirtualFile : VirtualFile
  {
    private string content;
    private SamplePathProvider spp;

    public bool Exists
    {
      get { return (content != null); }
    }

    public SampleVirtualFile(string virtualPath, SamplePathProvider provider)
      : base(virtualPath)
    {
      this.spp = provider;
      GetData();
    }

    protected void GetData()
    {
      // Get the data from the SamplePathProvider
      DataSet ds = spp.GetVirtualData();

      // Get the virtual file from the resource table.
      DataTable files = ds.Tables["resource"];
      DataRow[] rows = files.Select(
        String.Format("(name = '{0}') AND (type='file')", this.Name));

      // If the select returned a row, store the file contents.
      if (rows.Length > 0)
      {
        DataRow row = rows[0];

        content = row["content"].ToString();
      }
    }

    private string FormatTimeStamp(DateTime time)
    {
      return String.Format("{0} at {1}",
        time.ToLongDateString(), time.ToLongTimeString());
    }

    public override Stream Open()
    {
      string templateFile = HostingEnvironment.ApplicationPhysicalPath + "App_Data\\template.txt";
      string pageTemplate;
      DateTime now = DateTime.Now;

      // Try to get the page template out of the cache.
      pageTemplate = (string)HostingEnvironment.Cache.Get("pageTemplate");

      if (pageTemplate == null)
      {
        // Get the page template.
        using (StreamReader reader = new StreamReader(templateFile))
        {
          pageTemplate = reader.ReadToEnd();
        }

        // Set template timestamp
        pageTemplate = pageTemplate.Replace("%templateTimestamp%", 
          FormatTimeStamp(now));

        // Make pageTemplate dependent on the template file.
        CacheDependency cd = new CacheDependency(templateFile);

        // Put pageTemplate into cache for maximum of 20 minutes.
        HostingEnvironment.Cache.Add("pageTemplate", pageTemplate, cd,
          Cache.NoAbsoluteExpiration,
          new TimeSpan(0, 20, 0),
          CacheItemPriority.Default, null);
      }

      // Put the page data into the template.
      pageTemplate = pageTemplate.Replace("%file%", this.Name);
      pageTemplate = pageTemplate.Replace("%content%", content);

      // Get the data time stamp from the cache.
      DateTime dataTimeStamp = (DateTime)HostingEnvironment.Cache.Get("dataTimeStamp");
      pageTemplate = pageTemplate.Replace("%dataTimestamp%", 
        FormatTimeStamp(dataTimeStamp));
      pageTemplate = pageTemplate.Replace("%pageTimestamp%", 
        FormatTimeStamp(now));

      // Put the page content on the stream.
      Stream stream = new MemoryStream();
      StreamWriter writer = new StreamWriter(stream);

      writer.Write(pageTemplate);
      writer.Flush();
      stream.Seek(0, SeekOrigin.Begin);

      return stream;
    }
  }
}

Imports System.Data
Imports System.IO
Imports System.Security.Permissions
Imports System.Web
Imports System.Web.Caching
Imports System.Web.Hosting

Namespace Samples.AspNet.VB
  <AspNetHostingPermission(SecurityAction.Demand, Level:=AspNetHostingPermissionLevel.Minimal), _
   AspNetHostingPermission(SecurityAction.InheritanceDemand, level:=AspNetHostingPermissionLevel.Minimal)> _
  Public Class SampleVirtualFile
    Inherits VirtualFile

    Private content As String
    Private spp As SamplePathProvider

    Public ReadOnly Property Exists() As Boolean
      Get
        Return (content <> String.Empty)
      End Get
    End Property

    Public Sub New(ByVal virtualPath As String, ByVal provider As SamplePathProvider)
      MyBase.New(virtualPath)
      spp = provider
      GetData()
    End Sub

    Protected Sub GetData()
      ' Get the data from the SamplePathProvider.
      Dim spp As SamplePathProvider
      spp = CType(HostingEnvironment.VirtualPathProvider, SamplePathProvider)

      Dim ds As DataSet
      ds = spp.GetVirtualData

      ' Get the virtual file data from the resource table.
      Dim files As DataTable
      files = ds.Tables("resource")

      Dim rows As DataRow()
      rows = files.Select( _
        String.Format("(name='{0}') AND (type='file')", Me.Name))

      ' If the select returned a row, store the file contents.
      If (rows.Length > 0) Then
        Dim row As DataRow
        row = rows(0)

        content = row("content").ToString()
      End If
    End Sub


    Private Function FormatTimeStamp(ByVal time As DateTime) As String
      Return String.Format("{0} at {1}", _
        time.ToLongDateString(), time.ToLongTimeString)
    End Function

    Public Overrides Function Open() As System.IO.Stream
      Dim templateFile As String
      templateFile = HostingEnvironment.ApplicationPhysicalPath & "App_Data\template.txt"

      Dim pageTemplate As String
      Dim now As DateTime
      now = DateTime.Now

      ' Try to get the page template out of the cache.
      pageTemplate = CType(HostingEnvironment.Cache.Get("pageTemplate"), String)

      If pageTemplate Is Nothing Then
        ' Get the page template.
        Try
          pageTemplate = My.Computer.FileSystem.ReadAllText(templateFile)
        Catch fileException As Exception
          Throw fileException
        End Try

        ' Set template timestamp.
        pageTemplate = pageTemplate.Replace("%templateTimestamp%", _
          FormatTimeStamp(Now))

        ' Make pageTemplate dependent on the template file.
        Dim cd As CacheDependency
        cd = New CacheDependency(templateFile)

        ' Put pageTemplate into cache for maximum of 20 minutes.
        HostingEnvironment.Cache.Add("pageTemplate", pageTemplate, cd, _
          Cache.NoAbsoluteExpiration, _
          New TimeSpan(0, 20, 0), _
          CacheItemPriority.Default, Nothing)
      End If

      ' Put the page data into the template.
      pageTemplate = pageTemplate.Replace("%file%", Me.Name)
      pageTemplate = pageTemplate.Replace("%content%", content)

      ' Get the data timestamp from the cache.
      Dim dataTimeStamp As DateTime
      dataTimeStamp = CType(HostingEnvironment.Cache.Get("dataTimeStamp"), DateTime)
      pageTemplate = pageTemplate.Replace("%dataTimestamp%", _
        FormatTimeStamp(dataTimeStamp))

      ' Set a timestamp for the page.
      Dim pageTimeStamp As String
      pageTimeStamp = FormatTimeStamp(now)
      pageTemplate = pageTemplate.Replace("%pageTimestamp%", pageTimeStamp)

      ' Put the page content on the stream.
      Dim stream As MemoryStream
      stream = New MemoryStream()

      Dim writer As StreamWriter
      writer = New StreamWriter(stream)

      writer.Write(pageTemplate)
      writer.Flush()
      stream.Seek(0, SeekOrigin.Begin)

      Return stream
    End Function
  End Class
End Namespace

Das zweite Beispiel ist die XML-Datendatei, die verwendet wird, um das DataSet vom benutzerdefinierten VirtualPathProvider Objekt zurückgegebene Objekt aufzufüllen. Diese XML-Daten werden verwendet, um die Verwendung der VirtualPathProviderKlassen VirtualFilezum VirtualDirectory Abrufen von Daten aus externen Daten zu veranschaulichen und ist nicht für die Darstellung eines Datenspeichers in Produktionsqualität vorgesehen.

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

Das dritte Beispiel ist die Textdatei, die als Vorlage für die virtuelle Datei verwendet wird. Platzhalter in der Datei werden durch Text zwischen Prozentzeichen (%) dargestellt, z %file% . B. und %content%. Zeitstempel werden verwendet, um Änderungen an zwischengespeicherten virtuellen Dateidaten zu überwachen.

<html>
  <head>
    <title>File name: %file%</title>
  </head>

  <body>
    <h1>%file%</h1>
    <p>%content%</p>
    <p>Page timestamp: %pageTimestamp%<br>
       Data timestamp: %dataTimestamp%<br>
       Template timestamp: %templateTimestamp%</p>
  </body>
</html>

Hinweise

Die VirtualFile Klasse ist die Basisklasse für Objekte, die Dateien in einem virtuellen Dateisystem darstellen. In der Regel implementieren Sie eine absteigend von der VirtualFile Klasse für jedes VirtualPathProvider Objekt, das in Ihrer Webanwendung absteigend ist.

Hinweise für Ausführende

Wenn Sie von der VirtualFile Klasse erben, müssen Sie die Open() Methode überschreiben, um einen schreibgeschützten Datenstrom an den Inhalt der virtuellen Ressource zurückzugeben.

Konstruktoren

Name Beschreibung
VirtualFile(String)

Initialisiert eine neue Instanz der VirtualFile-Klasse.

Eigenschaften

Name Beschreibung
IsDirectory

Ruft einen Wert ab, der angibt, dass es sich um eine virtuelle Ressource handelt, die als Datei behandelt werden soll.

Name

Ruft den Anzeigenamen der virtuellen Ressource ab.

(Geerbt von VirtualFileBase)
VirtualPath

Ruft den virtuellen Dateipfad ab.

(Geerbt von VirtualFileBase)

Methoden

Name Beschreibung
CreateObjRef(Type)

Erstellt ein Objekt, das alle relevanten Informationen enthält, die zum Generieren eines Proxys erforderlich sind, der für die Kommunikation mit einem Remoteobjekt verwendet wird.

(Geerbt von MarshalByRefObject)
Equals(Object)

Bestimmt, ob das angegebene Objekt dem aktuellen Objekt entspricht.

(Geerbt von Object)
GetHashCode()

Dient als Standardhashfunktion.

(Geerbt von Object)
GetLifetimeService()
Veraltet.

Ruft das aktuelle Lebensdauerdienstobjekt ab, das die Lebensdauerrichtlinie für diese Instanz steuert.

(Geerbt von MarshalByRefObject)
GetType()

Ruft die Type der aktuellen Instanz ab.

(Geerbt von Object)
InitializeLifetimeService()

Gibt einer VirtualFileBase Instanz eine unendliche Lebensdauer, indem verhindert wird, dass eine Lease erstellt wird.

(Geerbt von VirtualFileBase)
MemberwiseClone()

Erstellt eine flache Kopie der aktuellen Object.

(Geerbt von Object)
MemberwiseClone(Boolean)

Erstellt eine flache Kopie des aktuellen MarshalByRefObject Objekts.

(Geerbt von MarshalByRefObject)
Open()

Wenn eine abgeleitete Klasse außer Kraft gesetzt wird, wird ein schreibgeschützter Datenstrom an die virtuelle Ressource zurückgegeben.

ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.

(Geerbt von Object)

Gilt für: