実行時にデータベースから ASPX ページをレンダリングする
-
21-09-2019 - |
質問
以下のコードを想定します。
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 への参照が含まれる可能性があることに注意してください。
これには大きなパフォーマンスの問題があるはずだと認識していますが、現段階ではどうすればそれができるかを知りたいだけです。明らかに、結果をキャッシュする必要があります。
ありがとう。
解決
あなたが進もうとしている道は本質的には Web サーバー ファイル システム以外のストレージ メカニズムから ASPX ファイルをロードする. 。その一部の実装を開始しましたが、実際にはこれを行うためにカスタム HttpHandler さえ必要ありません。ASP.NET には、実際の ASPX マークアップの他のソースを指定するための既存のメカニズムがあります。
それはと呼ばれます 仮想パスプロバイダー, これにより、ディスクからファイルをロードするデフォルトの機能を、たとえば 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 がサポートされます。
他のヒント
これを行う 1 つの方法は、次のサブクラスを作成することです。 仮想パスプロバイダー そして、呼び出して HostingEnvironment.VirtualPathProvider として設定します。 HostingEnvironment.RegisterVirtualPathProvider. 。いくつかのメソッドをオーバーライドする必要があります。最も重要なのは GetFile() です。ビルド システムがキャッシュを処理します。