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

ASPX Page Life Cycle when calling [WebMethod]s

我正在通过 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 被调用,但它不再是。

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

Page Methods 是完全成熟的 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();
    ...
}