【问题标题】:ASPX Page Life Cycle when calling [WebMethod]s调用 [WebMethod]s 时的 ASPX 页面生命周期
【发布时间】:2016-10-06 19:48:26
【问题描述】:

我通过 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 事件,我还尝试将 DB 设置内容移动到 Page_Init 事件中,但同样没有调用。

任何人都可以向我解释使用 WebMethods 时的 aspx 页面生命周期吗?这最初有效的事实似乎意味着 Page_Load 被调用,但它不再是。

【问题讨论】:

标签: c# asp.net ajax page-lifecycle


【解决方案1】:

请注意,您作为 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();
    ...
}

【讨论】:

  • 如何添加“ExternalLibrary.SetupDB();”在静态构造函数中?这样我认为可以避免代码重复。
  • @Boney,我不建议使用静态构造函数。这里的问题是您完全无法控制何时调用它。因此,对于 OP 的需求而言,它可能发生得太早。此外,当前代码每个请求调用一次,至少在页面方法的情况下,您无法确定静态 c'tor 会发生这种情况
  • 谢谢安德烈,你说的很有道理。但这仍然让我摸不着头脑,为什么这确实有效……而让我担心的是我在其他地方使用过这种模式(并且有效)-是否有任何您知道的机制可能允许这种情况发生,例如调用页面(而不是 [WebMethod])然后调用 [WebMethod]?
  • @Morvael,我不知道这种机制,我很想看看它发生时的情况 - 解释可能有点不同。
  • @Andrei,我刚刚深入挖掘了 ExternalLibrary。似乎 SetupDB() 东西都是静态的,并且可以在页面调用之间持续存在。所以看起来,在这种情况下,调用它一次就可以了,直到网站重新编译(我猜),这解释了为什么它有时会起作用。每次调用它似乎是唯一可靠的解决方案。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-20
  • 1970-01-01
相关资源
最近更新 更多