PagePaserで作成したPageをHttpHandlerとして使用

4808 ワード

ASP.NETでは、pageは実際にはHttpHandlerであり、要求を処理し、Htmlの山を返します.では、Pageクラスをインスタンス化して処理の結果を得ることができますか?簡単な推理でこれはだめだと説明できます.Pageをインスタンス化するとnew Page()が標準的になるからです.Netコード、コンパイラは関連するPageを知ることができません.aspxの内容.だからPagePaserの助けが必要で、PagePaserもASPです.NET内部コンパイルプロセスの重要なステップ.使用方法を見てみましょう.

  
    
protected void Page_Load( object sender, EventArgs e)
{
Response.Write(HttpUtility.HtmlEncode(DumpHtmlFrom(
" ~/Default.aspx " )));
}

// virtualPath: allow queries
string DumpHtmlFrom( string virtualPath)
{
StringWriter writer
= new StringWriter();
var path
= Request.Url.Scheme + " :// " + Request.Url.Authority + VirtualPathUtility.ToAbsolute(virtualPath);
var parts
= virtualPath.Split( ' ? ' );

string query = string .Empty;
if (parts.Length > 1 )
query
= parts[ 1 ];
virtualPath
= parts[ 0 ];

HttpContext context
= new HttpContext( new HttpRequest(virtualPath, path, query), new HttpResponse(writer));
var handler
= PageParser.GetCompiledPageInstance(virtualPath, MapPath(virtualPath), context);
handler.ProcessRequest(context);

return writer.ToString();
}

ここで重要なステップはPageParserです.GetCompiledPageInstanceはHttpHandlerをインスタンス化し、すべてのHtmlを返します.