7

假设下面的代码:

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 的引用。

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

谢谢。

4

2 回答 2

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);
    }
}

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

于 2009-11-23T05:47:20.653 回答
1

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

于 2009-11-23T05:48:56.203 回答