您好,我正试图在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>
谢谢你, 纳古
答案 0 :(得分:3)
我已经使用以下代码进行了测试,但它运行正常。
在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>
在Codebehind中
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方法中放置断点,以验证它是否在卸载时被点击。
答案 1 :(得分:1)
你要做的是一个坏主意。考虑在会话中添加更少的数据,或者降低超时。
也许您没有意识到当用户刷新或离开页面时onunload会触发。因此,假设您的代码实际工作,如果您的用户刷新了他们的页面,那么他们的会话将被终止。如果他们访问了网站上的任何其他页面,他们的会话也将被终止!
可能不是您希望的功能!
答案 2 :(得分:0)
无法始终如一地处理此类事件。会话“结束”的原因太多了。其中最简单的是丢失或封闭的连接。在这种情况下,任何被解雇的JavaScript都不会到达服务器。
即使你能按照你想要的方式工作,它也只能在部分时间内工作。如果你不能依赖它,你的时间可能会花费不同的解决方案。
答案 3 :(得分:0)
已经有几年了,但我不知道WebMethod可能是静态的。