Pergunta

Assumindo o código abaixo:

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

Como posso implementar createPage Método para instanciar uma página com base no conteúdo simples da string do ASPX?

A nota é que a string ASPX em si pode ser referência à página master já existente no disco.

Sei que deve haver um enorme problema de desempenho com isso, mas nesta fase eu só quero saber como posso fazer isso. Obviamente, terei que cache o resultado.

Obrigado.

Foi útil?

Solução

O caminho que você está tentando seguir é essencialmente Carregando arquivos ASPX de algum outro mecanismo de armazenamento além do sistema de arquivos do servidor da web. Você começou a implementar parte disso, mas na verdade nem precisa de um httphandler personalizado para fazer isso - asp.net possui um mecanismo existente para especificar outras fontes da marcação ASPX real.

É chamado de VirtualPathProvider, e permite trocar a funcionalidade padrão para carregar os arquivos do disco com, digamos, carregá -los no SQL Server ou em qualquer outro lugar faz sentido. Em seguida, você pode aproveitar todo o compilamento e o cache interno que o ASP.NET usa por conta própria.

O núcleo da funcionalidade vem no Método getfile e a 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);
    }
}

Observe que hoje, usando um VirtualPathProvider personalizado, exige confiança total. No entanto, em breve, o ASP.NET 4.0 estará disponível e suporta VPPs sob confiança média.

Outras dicas

Uma maneira de fazer isso é criar uma subclasse de VirtualPathProvider e defina -o como o HostingEnvironment.virtualPathProvider ligando para HostingEnvironment.RegistervirtualPathProvider. Você terá que substituir alguns métodos. O mais importante é getfile (). O sistema de construção cuidará do cache.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top