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

C# 调用[WebMethod]时的ASPX页面生命周期,c#,asp.net,ajax,page-lifecycle,C#,Asp.net,Ajax,Page Lifecycle,我通过jQueryAjax调用了许多用[WebMethod]修饰的方法 这些要求在外部库中设置数据库连接,对于每个方法都是相同的 我的原始代码如下所示: public partial class Server : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { // code to set up DB connections ExternalLi

我通过jQueryAjax调用了许多用[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事件,我还尝试将DB安装程序移到Page_Init事件中,但同样没有调用它


有人能向我解释一下使用WebMethods时aspx页面的生命周期吗?这一功能最初起作用的事实似乎意味着调用了Page_Load,但现在已经不是了。

请注意,作为WebMethod使用的方法是静态的,这应该是第一个提示,说明根本没有创建Page对象

页面方法是成熟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();
    ...
}

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

页面方法是成熟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();
    ...
}

在静态构造函数中添加“ExternalLibrary.SetupDB();”怎么样?我认为这样可以避免代码重复。@Boney,我不建议使用静态构造函数。这里的问题是,您完全无法控制何时调用它。因此,对于OP的需求来说,这可能发生得太早。此外,当前代码对每个请求调用一次,至少在页面方法的情况下,您不能确定静态c'torThanks Andrei会发生这种情况,您的说法完全有道理。但这仍然让我摸不着头脑,为什么这会奏效。。。让我担心的是,我在其他地方使用过这种模式(它是有效的)-您是否知道有任何机制允许这种情况发生,例如调用页面(而不是[WebMethod]),然后随后调用[WebMethod]?@Morvael,我不知道这种机制,我很想看到这种情况发生的时候——解释可能有点不同。@Andrei,我刚刚对外部图书馆进行了更深入的挖掘。SetupDB()似乎都是静态的,可以在页面调用之间保持不变。因此,在这种情况下,在网站重新编译之前(我猜是这样),调用一次就可以了,这解释了为什么它有时会起作用。每次调用它似乎是唯一可靠的解决方案。再次感谢。在静态构造函数中添加“ExternalLibrary.SetupDB();”怎么样?我认为这样可以避免代码重复。@Boney,我不建议使用静态构造函数。这里的问题是,您完全无法控制何时调用它。因此,对于OP的需求来说,这可能发生得太早。此外,当前代码对每个请求调用一次,至少在页面方法的情况下,您不能确定静态c'torThanks Andrei会发生这种情况,您的说法完全有道理。但这仍然让我摸不着头脑,为什么这会奏效。。。让我担心的是,我在其他地方使用过这种模式(它是有效的)-您是否知道有任何机制允许这种情况发生,例如调用页面(而不是[WebMethod]),然后随后调用[WebMethod]?@Morvael,我不知道这种机制,我很想看到这种情况发生的时候——解释可能有点不同。@Andrei,我刚刚对外部图书馆进行了更深入的挖掘。SetupDB()似乎都是静态的,可以在页面调用之间保持不变。因此,在这种情况下,在网站重新编译之前(我猜是这样),调用一次就可以了,这解释了为什么它有时会起作用。每次调用它似乎是唯一可靠的解决方案。再次感谢。