2009-11-23 12 views
7

Supponendo che il codice qui sotto:Render pagina ASPX in fase di esecuzione dal database

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 metodo per creare un'istanza di una pagina in base al contenuto della stringa piana di ASPX?

La nota è che la stringa ASPX stessa può contenere riferimento a MasterPage già esistente sul disco.

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

Grazie.

+0

In attesa di risposta. Sarebbe fantastico se fosse possibile. Buona domanda. –

+0

L'input di Gonzalo e Rex riportato di seguito è accurato, ma tenere presente che l'implementazione di una nuova sottoclasse VirtualPathProvider richiede autorizzazioni di trust complete (o eseguite in un punto) e potrebbe non essere eseguibile in un ambiente di hosting condiviso. – Chris

+0

Sì. La piena fiducia è una grande limitazione. Una soluzione con fiducia media sarebbe ovviamente migliore, se esiste. –

risposta

9

Il percorso che si sta tentando di chiudere è essenzialmente caricamento di file ASPX da un altro meccanismo di archiviazione rispetto al file system del server Web. Hai iniziato a implementarne una parte, ma in realtà non hai nemmeno bisogno di un HttpHandler personalizzato per farlo: ASP.NET ha un meccanismo esistente per specificare altre fonti dell'attuale markup ASPX.

Si chiama VirtualPathProvider e consente di sostituire la funzionalità predefinita per caricare i file dal disco con, ad esempio, caricandoli da SQL Server o in qualsiasi altro senso. Quindi è possibile sfruttare tutta la compilazione e il caching incorporati che ASP.NET utilizza da solo.

Il nucleo della funzionalità viene nel GetFile method e la VirtualFile's 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); 
    } 
} 

Nota che oggi, utilizzando un VirtualPathProvider personalizzato richiede piena fiducia. Tuttavia, presto ASP.NET 4.0 sarà disponibile e supporterà i VPP in media affidabilità.

+0

Suona molto bene! Grazie. Ho trovato un esempio per ASP.NET MVC qui: http://padcom13.blogspot.com/2009/04/virtualpathprovider-example.html –

+0

Supponiamo che la pagina di aspx abbia bisogno di un assembly che contenga il codice sottostante. Cosa possiamo fare allora? – Mark

Problemi correlati