Frage

Unter der Annahme, den Code unten:

public class DynamicAspxHandler : IHttpHandler {
    bool IHttpHandler.IsReusable { get { return false; } }

    void IHttpHandler.ProcessRequest(HttpContext httpContext) {
        string aspxContent = PlainASPXContent();
        Page page = CreatePage(httpContext, aspxContent);
        page.ProcessRequest(httpContext);
    }

    Page CreatePage(HttpContext context, string aspxContent) {
        // How to implement this?
    }
}

Wie kann ich implementieren Create Methode eine Seite basierend auf der Ebene String Inhalt von ASPX zu instanziiert?

Der Hinweis ist, dass die ASPX String selbst Verweis auf bereits bestehende Masterpage auf der Platte containt kann.

Ich weiß, es muss mit diesem großen Performance-Problem sein, aber in diesem Stadium ich will nur wissen, wie ich das tun kann. Offensichtlich muss ich auf das Ergebnis zwischenspeichern.

Danke.

War es hilfreich?

Lösung

Der Weg Sie versuchen, im Wesentlichen zu gehen ist Laden ASPX-Dateien von einem anderen Speichermechanismus als das Web-Server-Dateisystem . Sie haben damit begonnen Teil davon zu implementieren, aber Sie brauchen eigentlich nicht einmal einen benutzerdefinierten Httphandler, dies zu tun -. ASP.NET hat einen bestehenden Mechanismus für andere Quellen der aktuellen ASPX-Markup Angabe

Es ist ein VirtualPathProvider , und es können Sie die Standardfunktionalität auszulagern, um die Dateien von der Festplatte geladen mit, sagen wir, sie von SQL Server oder wo auch immer macht Sinn zu laden. Dann können Sie alle Vorteile nutzen die integrierten zusammengestellt und Caching, dass ASP.NET Anwendungen auf seinem eigenen.

Der Kern der Funktionalität kommt in der GetFile Methode und die Virtual der Open () :

public override VirtualFile GetFile(string virtualPath)
{
    //lookup ASPX markup
    return new MyVirtualFile(aspxMarkup);
}

//...

public class MyVirtualFile : VirtualFile
{
    private string markup;

    public MyVirtualFile(string markup)
    {
        this.markup = markup;
    }

    public override Stream Open()
    {
        return new StringReader(this.markup);
    }
}

Beachten Sie, dass heute, mit einem benutzerdefinierten VirtualPathProvider erfordert volles Vertrauen. Doch bald ASP.NET 4.0 verfügbar sein wird und es unterstützt VPP unter mittlerer Vertrauenswürdigkeit.

Andere Tipps

Eine Möglichkeit, es zu tun, ist eine Unterklasse von VirtualPathProvider und legen sie es als HostingEnvironment.VirtualPathProvider durch den Aufruf HostingEnvironment.RegisterVirtualPathProvider . Sie werden ein paar Methoden außer Kraft setzen müssen. Das wichtigste ist GetFile (). Das Build-System kümmert sich um das Caching übernehmen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top