Pregunta

Suponiendo que el código de abajo:

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 de ASPX en sí mismo puede containt referencia a la ya existente MasterPage en el disco.

Me da cuenta de que debe haber gran problema de rendimiento con esto, pero en este momento sólo quiero saber cómo puedo hacer eso. Obviamente voy a tener que almacenar en caché el resultado.

Gracias.

¿Fue útil?

Solución

La ruta que está tratando de bajar es esencialmente cargar archivos ASPX desde algún otro mecanismo de almacenamiento que el sistema de archivos del servidor web . Usted ha comenzado a poner en práctica parte de eso, sino que en realidad ni siquiera necesita una costumbre HttpHandler para hacer esto -. ASP.NET tiene un mecanismo existente para especificar otras fuentes del recargo real ASPX

Se llama VirtualPathProvider , y que le permite cambiar la funcionalidad por defecto para cargar los archivos del disco con, por ejemplo, cargándolos desde SQL Server o en cualquier otro sentido marcas. A continuación, puede aprovechar todo el incorporado en la recopilación y almacenamiento en caché de ASP.NET que los usos por su cuenta.

El núcleo de la funcionalidad viene en el GetFile método y los de VirtualFile 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 requiere plena confianza. Sin embargo, pronto ASP.NET 4.0 estará disponible y es compatible con VPP bajo confianza medio.

Otros consejos

Una forma de hacerlo es mediante la creación de una subclase de VirtualPathProvider y configurarlo como la HostingEnvironment.VirtualPathProvider llamando HostingEnvironment.RegisterVirtualPathProvider . Usted tendrá que reemplazar algunos métodos. Siendo los más importantes GetFile (). El sistema de construcción se hará cargo de almacenamiento en caché.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top