调用[WebMethod]时的ASPX页面生命周期

本文关键字:生命 周期 ASPX 时的 WebMethod 调用 | 更新日期: 2023-09-27 18:11:44

我正在调用一些通过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的数据库尚未初始化。

在我的代码中放置断点,我发现Page_Load事件在调用我的AjaxAccessibleMethod时没有被调用,我还尝试将DB设置的东西移动到Page_Init事件中,但同样没有调用。

谁能给我解释一下使用WebMethods时aspx页面的生命周期?这个工作最初似乎意味着调用了Page_Load,但它不再是。

调用[WebMethod]时的ASPX页面生命周期

请注意,作为WebMethod使用的方法是静态的,这应该是第一个提示页面对象根本没有创建的事实。

Page Methods是完整web服务的简单替代方案,因此,它的生命周期更类似于web服务而不是页面。也就是说,请求通过一般的ASP。. NET管道,带有HttpContext, Request等对象。但是,不同之处在于:对于页面请求和回发,创建了页面对象,并发生了整个页面事件系列,而对于页面方法,不创建页面对象,并且方法被简单地称为Server.AjaxAccessibleMethod()

确实没有办法将两者混合在一起,因为这将不必要地使调用page方法的处理复杂化。所以这里唯一的路径是重复必要的代码:

protected void Page_Load(object sender, EventArgs e)
{
    // code to set up DB connections
    ExternalLibrary.SetupDB(); 
}
[WebMethod]
public static string AjaxAccessibleMethod()
{
    ExternalLibrary.SetupDB();
    ...
}