调用[WebMethod] s

时间:2016-10-06 11:20:06

标签: 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
        }
    }
}

这是有效的,但随后开始抛出异常,声称ExternalLibrary的数据库尚未初始化。

在我的代码中放置断点我发现在调用AjaxAccessibleMethod时没有调用Page_Load事件,我也尝试将数据库设置内容移动到Page_Init事件中,但同样没有调用。

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

1 个答案:

答案 0 :(得分: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();
    ...
}