从运行时在数据库中呈现ASPX页面

Dmy*_*iak 7 .net asp.net dynamic-compilation httphandler

假设代码如下:

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?
    }
}
Run Code Online (Sandbox Code Playgroud)

如何实现CreatePage方法基于ASPX的纯字符串内容实例化页面?

注意,ASPX字符串本身可以包含对磁盘上已存在的MasterPage的引用.

我意识到这一点必然存在巨大的性能问题,但在这个阶段我只想知道如何做到这一点.显然我必须缓存结果.

谢谢.

Rex*_*x M 9

您尝试关闭的路径实际上是从Web服务器文件系统以外的其他存储机制加载ASPX文件.您已经开始实现其中的一部分,但实际上您甚至不需要自定义HttpHandler来执行此操作 - ASP.NET具有用于指定实际ASPX标记的其他来源的现有机制.

它被称为VirtualPathProvider,它允许您交换默认功能以从磁盘加载文件,例如,从SQL Server加载它们或其他任何有意义的地方.然后,您可以利用ASP.NET自己使用的所有内置编译和缓存.

功能的核心来自GetFile方法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);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,今天使用自定义VirtualPathProvider确实需要完全信任.但是,很快ASP.NET 4.0将可用,它支持中等信任的VPP.