Domanda

Supponendo che il codice qui sotto:

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

come posso implementare CreatePage il metodo per creare un'istanza di una pagina in base al contenuto della stringa piana di ASPX?

La nota è che la stringa ASPX stesso può containt riferimento MasterPage già esistente sul disco.

Mi rendo conto che ci deve essere enorme problema di prestazioni con questo, ma in questa fase voglio solo sapere come posso farlo. Ovviamente dovrò mettere in cache il risultato.

Grazie.

È stato utile?

Soluzione

Il percorso si sta cercando di andare giù è essenzialmente il caricamento di file ASPX da qualche altro meccanismo di memorizzazione di file server web system . Hai iniziato a implementare parte di questo, ma in realtà non è nemmeno necessario un costume HttpHandler per fare questo -. ASP.NET ha un meccanismo esistente per specificare altre fonti di markup attuale ASPX

Si chiama VirtualPathProvider , e consente di scambiare la funzionalità predefinita per il caricamento dei file dal disco con, diciamo, caricandoli da SQL Server o in qualsiasi altro senso. Poi si può approfittare di tutto il built-in compilazione e il caching che ASP.NET utilizza per sé.

Il nucleo della funzionalità viene nel metodo GetFile e il VirtualFile di 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);
    }
}

Si noti che oggi, utilizzando un VirtualPathProvider personalizzato richiede piena fiducia. Tuttavia, ben presto ASP.NET 4.0 sarà disponibile e supporta VPP sotto attendibilità media.

Altri suggerimenti

Un modo per farlo è attraverso la creazione di una sottoclasse di VirtualPathProvider e impostarlo come HostingEnvironment.VirtualPathProvider chiamando HostingEnvironment.RegisterVirtualPathProvider . Si dovrà sostituire alcuni metodi. Il più importante è GetFile (). Il sistema di compilazione si prenderà cura di caching.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top