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

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被调用,但它不再是.

And*_*rei 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();
    ...
}
Run Code Online (Sandbox Code Playgroud)