【问题标题】:Calling a Page Method when the Browser Closes浏览器关闭时调用页面方法
【发布时间】:2009-07-07 10:45:29
【问题描述】:

您好,我正在尝试在 bodyunload 方法上调用 [webmethod]。

但它只会在页面加载本身时被触发。如何预防?

这是我正在使用的代码:

[WebMethod]
public static void AbandonSession()
{
    HttpContext.Current.Session.Abandon();
}


<script language="javascript" type="text/javascript">
//<![CDATA[

function HandleClose() {
    PageMethods.AbandonSession();
}

//]]>
</script>

<body onunload="HandleClose()">
....
....
....
</body>

谢谢你, 那古

【问题讨论】:

  • 你能发布一些代码来说明发生了什么吗?
  • 太棒了。现在是什么让你认为 webmethod 被调用了,HandleClose 被调用了吗?

标签: c# asp.net web-services asmx pagemethods


【解决方案1】:

我已经用下面的代码进行了测试,它工作正常。

在 Aspx 页面中

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>

    <script type="text/javascript">
        //<![CDATA[

        function HandleClose()
        {


            PageMethods.AbandonSession();
        }

        //]]>    
    </script>

</head>
<body onunload="HandleClose()">
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true">
    </asp:ScriptManager>
    </form>
</body>
</html>

在代码隐藏中

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Services;

public partial class ClearSessionOnPageUnload : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    [WebMethod]
    public static void AbandonSession()
    {
        HttpContext.Current.Session.Abandon();
    }

}

您可以在 AbandonSession 方法处设置断点,以验证它是否在卸载时被命中。

【讨论】:

    【解决方案2】:

    你试图做的是一个坏主意。考虑在会话中放入更少的数据,或降低超时时间。

    也许您没有意识到当用户刷新或离开页面时会触发 onunload。因此,假设您的代码确实有效,如果您的用户刷新了他们的页面,那么他们的会话将被终止。如果他们访问了网站上的任何其他页面,他们的会话也将被终止!

    可能不是您希望的功能!

    【讨论】:

      【解决方案3】:

      没有办法始终如一地处理此类事件。会话“结束”的原因太多。其中最简单的将是丢失或关闭的连接。在这种情况下,任何触发的 JavaScript 都不会到达服务器。

      即使你可以按照你想要的方式让它工作,它也只会在部分时间里工作。如果你不能依赖它,你的时间可能会被浪费在一个不同的解决方案上。

      【讨论】:

        【解决方案4】:

        几年过去了,不知道WebMethod可以是静态的。

        【讨论】:

        猜你喜欢
        • 2014-04-15
        • 2020-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多