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

ASPXのプレーン文字列コンテンツに基づいてページをインスタンス化する CreatePageメソッドを実装するにはどうすればよいですか?

注意点として、ASPX文字列自体には、ディスク上にすでに存在するMasterPageへの参照を含めることはできません。

これには大きなパフォーマンスの問題があるはずですが、この段階では、どうすればそれができるのかを知りたいだけです。明らかに、結果をキャッシュする必要があります。

ありがとう。

4

2 に答える 2

9

たどろうとしているパスは、基本的に、Webサーバーファイルシステム以外のストレージメカニズムからASPXファイルをロードすることです。その一部の実装を開始しましたが、実際には、これを行うためにカスタムHttpHandlerも必要ありません。ASP.NETには、実際のASPXマークアップの他のソースを指定するための既存のメカニズムがあります。

これはVirtualPathProviderと呼ばれ、ディスクからファイルをロードするためのデフォルトの機能を、たとえばSQLServerまたはその他の意味のある場所からロードすることで置き換えることができます。次に、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

これを行う1つの方法は、 VirtualPathProviderのサブクラスを作成し、HostingEnvironment.RegisterVirtualPathProviderを呼び出してHostingEnvironment.VirtualPathProviderとして設定することです。いくつかのメソッドをオーバーライドする必要があります。最も重要なのはGetFile()です。ビルドシステムがキャッシュを処理します。

于 2009-11-23T05:48:56.203 に答える