我们公司希望将我们的 Web 应用程序的预编译版本提供给第三方,以便他们可以向其中添加自己的页面和模块。为了实现这一目标,到目前为止,我已经完成了以下工作:
- 将我们的主要 Web 应用程序编译为 Web 部署项目
- 创建了一个 POC Web 应用程序,该应用程序引用了上述第 1 步产生的 DLL。
然后,我将以下静态方法添加到我们的主 Web 应用程序中,它有望处理对其预编译的 aspx 页面的请求:
public static bool TryProcessRequest(HttpContext context)
{
string rawUrl = context.Request.RawUrl;
int aspxIdx = rawUrl.IndexOf(".aspx");
if (aspxIdx > 0)
{
string aspxPagePath = rawUrl.Substring(0, aspxIdx + 5);
string aspxPageClassName = aspxPagePath.Substring(1).Replace('/','_').Replace(".aspx","");
Assembly website = Assembly.GetAssembly(typeof(MCLLogin));
Type pageClass = website.GetType(aspxPageClassName);
ConstructorInfo ctor = pageClass.GetConstructor(new Type[] { });
IHttpHandler pageObj = (IHttpHandler)ctor.Invoke(new object[] { });
context.Server.Execute(pageObj, context.Response.Output, false);
//alternative: invoking the page's ProcessRequest method - same results
//System.Reflection.MethodInfo method = pageClass.GetMethod("ProcessRequest");
//method.Invoke(pageObj, new object[] { context });
return true;
}
return false; //not handled
}
然后,每当我希望我们的主 Web 应用程序处理请求时,我都会在 POC Web 应用程序的ProcessRequest()
方法中调用此方法。HttpHandler
该代码确实成功地实例化了正确类的页面并开始处理请求。
问题:
我的Page_PreLoad
处理程序中的代码抛出异常,因为Page.Form
是null。我还发现Page.Controls
集合是空的。
我究竟做错了什么?我应该走一条不同的道路来实现这一目标吗?