我调用了许多通过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
}
}
}
这是有效的,但随后开始抛出异常,声称ExternalLibrary的数据库尚未初始化。
在我的代码中放置断点我发现在调用AjaxAccessibleMethod时没有调用Page_Load事件,我也尝试将数据库设置内容移动到Page_Init事件中,但同样没有调用。
使用WebMethods时,有人可以向我解释aspx页面生命周期吗?这最初起作用的事实似乎意味着调用了Page_Load,但它不再是。
答案 0 :(得分:6)
请注意,您用作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();
...
}