2009-11-23 10 views
7

Suponiendo que el código de abajo:Render página ASPX en tiempo de ejecución de la base de datos

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

cómo puedo aplicar CreatePage método para crear instancias de una página basada en el contenido de la cadena llanura de ASPX?

La nota es que la cadena ASPX en sí misma puede contener una referencia a la página maestra ya existente en el disco.

Me doy cuenta de que debe haber un gran problema de rendimiento con esto, pero en este momento solo quiero saber cómo puedo hacerlo. Obviamente tendré que guardar el resultado en caché.

Gracias.

+0

Esperamos la respuesta. Sería increíble si fuera posible. Buena pregunta. –

+0

La entrada de Gonzalo y Rex a continuación es precisa, pero tenga en cuenta que la implementación de una nueva subclase VirtualPathProvider requiere permisos de plena confianza (o lo hizo en un punto) y puede no ejecutarse en un entorno de alojamiento compartido. – Chris

+0

Sí. La plena confianza es una gran limitación. Una solución con confianza media sería, por supuesto, mejor, si es que existe. –

Respuesta

9

La ruta que intenta bajar es esencialmente cargando archivos ASPX de algún otro mecanismo de almacenamiento que el sistema de archivos del servidor web. Ha comenzado a implementar parte de eso, pero en realidad ni siquiera necesita un HttpHandler personalizado para hacer esto: ASP.NET tiene un mecanismo existente para especificar otras fuentes del marcado ASPX real.

Se llama VirtualPathProvider, y le permite cambiar la funcionalidad predeterminada para cargar los archivos desde el disco con, por ejemplo, cargarlos desde SQL Server o donde sea que tenga sentido. Luego puede aprovechar toda la compilación y el almacenamiento en caché integrados que ASP.NET usa por sí solo.

El núcleo de la funcionalidad viene en el GetFile method y 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); 
    } 
} 

Tenga en cuenta que hoy en día, utilizando una costumbre VirtualPathProvider no requieren plena confianza. Sin embargo, pronto ASP.NET 4.0 estará disponible y admite VPP bajo confianza media.

+0

¡Suena muy bien! Gracias. Encontré una muestra para ASP.NET MVC aquí: http://padcom13.blogspot.com/2009/04/virtualpathprovider-example.html –

+0

Digamos que la página aspx necesita un ensamblado que contenga el código detrás. ¿Qué podemos hacer entonces? – Mark

Cuestiones relacionadas