【问题标题】:Render ASPX page at runtime from database在运行时从数据库渲染 ASPX 页面
【发布时间】:2010-12-19 08:55:10
【问题描述】:

假设代码如下:

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

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

请注意,ASPX 字符串本身不能包含对磁盘上现有 MasterPage 的引用。

我意识到这肯定存在巨大的性能问题,但在这个阶段我只想知道如何做到这一点。显然我将不得不缓存结果。

谢谢。

【问题讨论】:

  • 期待答案。如果可能的话,那就太棒了。好问题。
  • 以下来自 Gonzalo 和 Rex 的输入是准确的,但请注意,实现新的 VirtualPathProvider 子类需要完全信任权限(或曾在某一时刻这样做),并且可能无法在共享托管环境中运行。
  • 是的。完全信任是很大的限制。如果存在这种情况,具有中等信任度的解决方案当然会更好。

标签: .net asp.net httphandler dynamic-compilation


【解决方案1】:

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

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

功能的核心在于GetFile methodVirtualFile'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);
    }
}

请注意,今天,使用自定义 VirtualPathProvider 确实需要完全信任。不过,ASP.NET 4.0 很快就会推出,它支持中等信任度下的 VPP。

【讨论】:

【解决方案2】:

一种方法是创建VirtualPathProvider 的子类,并通过调用HostingEnvironment.RegisterVirtualPathProvider 将其设置为HostingEnvironment.VirtualPathProvider。您将不得不覆盖一些方法。最重要的是 GetFile()。构建系统将负责缓存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 2023-03-12
    • 2013-07-26
    • 1970-01-01
    相关资源
    最近更新 更多