如何获取aspx页面的HttpHandler?

时间:2014-03-26 12:30:47

标签: asp.net httphandler

如何获取aspx页面的HttpHandler?

例如,我的 test.aspx 代码隐藏在public class Test : System.Web.UI.Page [...]之后
如果我致电new Test()它没有返回与HttpApplication.Context.Handler获得的HttpHandler完全相同的HttpHandler,可以在浏览 test.aspx

仅供参考(并且最终不是问题):我需要这样做,因为我将使用Server.Transfer(NewPageHandler)

做复杂的事情

2 个答案:

答案 0 :(得分:1)

基本上,在您的情况下,Test是实际Test.aspx类的父级(即,ASPX文件被编译为继承自Test的类)。

要获取Test.aspx实例,一个选项是直接使用编译器:

BuildManager.CreateInstanceFromVirtualPath("~/Test.aspx", typeof(Test));

或者你可以使用PageParser.GetCompiledPageInstance作为Murali Murugesan的建议,它们非常相同。

请注意,这并不是真正支持的("此API支持.NET Framework基础结构,不能直接在您的代码中使用。"),但它确实很有效。我实际上在我的代码中切换到了默认的PageHandlerFactory,这更稳定了:

class LuPageHandlerFactory : PageHandlerFactory
{
  public static LuPageHandlerFactory Instance = new LuPageHandlerFactory();
  private LuPageHandlerFactory() { }
}

// Which lets me call this:
var handler = 
  LuPageHandlerFactory.Instance.GetHandler
    (
      HttpContext.Current, null, "~/Test.aspx", null
    ) as Test;

更简洁的方法就是使用HttpContext.Current.RewritePath("~/Test.aspx");并传递HttpContext.Current.Items中的数据。

我的引擎实际上使用了我提到的最后一种方法作为后备 - 如果LuPageHandlerFactory方法抛出SecurityException,我会回退到RewritePath。 您还应该处理HttpCompileException

答案 1 :(得分:1)

您可以获得页面的已编译实例

System.Web.UI.PageParser
.GetCompiledPageInstance("~/YourPage.aspx",
                        HttpApplication.Server.MapPath("~/YourPage.aspx")
                      , HttpApplication.Context);