Mor*_*ael 0 c# asp.net ajax page-lifecycle
我正在调用许多通过jQuery ajax用[WebMethod]修饰的方法.
这些需要在外部库中设置数据库连接,每个方法都是相同的.
我原来的代码看起来像这样:
public partial class Server : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// code to set up DB connections
ExternalLibrary.SetupDB();
}
[WebMethod]
public static string AjaxAccessibleMethod()
{
try
{
// get some data from the database via the external library
ExternalLibrary.CallDatabase();
}
catch(Exception ex)
{
// handle errors
}
}
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,但后来开始抛出异常,声称ExternalLibrary的数据库尚未初始化.
在我的代码中放置断点我发现在调用我的AjaxAccessibleMethod时没有调用Page_Load事件,我也尝试将数据库设置内容移动到Page_Init事件中,但同样没有调用.
使用WebMethods时,有人可以向我解释aspx页面生命周期吗?这最初工作的事实似乎暗示了Page_Load被调用,但它不再是.
请注意,您作为WebMethod使用的方法是静态的,这应该是对根本不创建Page对象这一事实的第一个提示.
页面方法是完整的Web服务的简单替代方法,因此,其生命周期更类似于Web服务而不是页面.也就是说,请求通过一般的ASP.NET管道,使用像HttpContext,Request等对象.但随后出现差异:对于页面请求和回发,页面对象被创建并且整个页面事件系列发生,而对于页面方法,页面对象不会被创建,并且方法被简单地称为Server.AjaxAccessibleMethod().
实际上没有办法将两者混合在一起,因为这会不必要地使对页面方法的调用处理变得复杂.因此,这里唯一的前进道路是重复必要的代码:
protected void Page_Load(object sender, EventArgs e)
{
// code to set up DB connections
ExternalLibrary.SetupDB();
}
[WebMethod]
public static string AjaxAccessibleMethod()
{
ExternalLibrary.SetupDB();
...
}
Run Code Online (Sandbox Code Playgroud)