Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获得会话结束的通知?_C#_Asp.net_Session_Timeout - Fatal编程技术网

C# 如何获得会话结束的通知?

C# 如何获得会话结束的通知?,c#,asp.net,session,timeout,C#,Asp.net,Session,Timeout,我想知道我是否可以处理会话超时事件。我需要在会话超时、用户离开我的页面或关闭浏览器窗口之前对我的函数进行函数调用。这里最重要的部分是访问会话期间存储的所有内容,会话变量。看看global.asax中的session_End()方法。global.asax文件应该已经连接到会话结束时调用此方法。你可以随意把你的代码放进去 Sub Session_End(ByVal sender As Object, ByVal e As EventArgs) ' Fires when th

我想知道我是否可以处理会话超时事件。我需要在会话超时、用户离开我的页面或关闭浏览器窗口之前对我的函数进行函数调用。这里最重要的部分是访问会话期间存储的所有内容,会话变量。

看看global.asax中的session_End()方法。global.asax文件应该已经连接到会话结束时调用此方法。你可以随意把你的代码放进去

    Sub Session_End(ByVal sender As Object, ByVal e As EventArgs)
        ' Fires when the session ends
    End Sub
当然,您应该注意到会话完全是服务器端的事情。它只会在X分钟不活动后结束(默认为20分钟)。它不会在用户关闭窗口的瞬间结束。ASP.NET不知道用户是否关闭了窗口或离开了您的页面

事实上,当这种情况发生时,尝试在服务器端执行任何即时操作是很棘手的。我的意思是,在Javascript中调用window.onbeforeunload并在用户关闭窗口之前弹出确认框很容易。但是,当您试图在窗口实际关闭之前立即将数据包发送到服务器时,我认为您会发现,要使其对用户友好变得非常困难。您可以编写一些Javascript,使用AJAX向服务器发送消息,AJAX通知服务器用户正在关闭浏览器,然后在发送消息后使用更多Javascript关闭浏览器。但是用户会收到一条恼人的消息(在大多数浏览器中),说明脚本正试图关闭窗口。这在用户看来非常业余,可能会让他们在回来时三思而后行


因此,如果您愿意忍受延迟,我将完全避免Javascript的混乱,并依赖于使用Session_End()的纯服务器端解决方案。毕竟,如果用户关闭窗口或离开,ASP.NET最终会注意到,因为会话将超时。

web是无状态的,因此您无法知道用户是否关闭了浏览器窗口。您可以使用global.asax文件中的“Session_End”事件进行会话超时。如果要访问所有会话,可以通过“会话\启动”事件将它们存储在集合中,也可以存储在全局文件中

编辑:如果您想使用javascript截取页面的关闭事件,下面是如何截取的(注意,这是不可靠的):


会话结束将处理会话超时问题。但是,当用户关闭浏览器或移动到其他URL时,不会触发此操作。它将等待会话超时过期

为了检测其他条件,您必须在客户端上使用javascript。但是,这些方法并不总是可靠的,这取决于浏览器/版本等。此外,如果用户的计算机关闭、被拔出或完全消失,此脚本也不会启动


你可以考虑其他的选择。使用此函数,您到底想实现什么?

您可以拥有一个由每个aspx页面继承的basepage&在您的basepage init事件中,只需检查会话变量就可以了。如果没有,则表示会话已过期,您可以将用户重定向到登录页。

记住网站不是windows程序,这一点很重要。例如,很难在用户离开页面之前弹出提示用户保存的消息。这是可能的,但并不容易,而且通常非常难看。大卫-不,这并不难,而且它只和windows对话框一样难看。我认为这很难看,因为你无法控制消息框的外观。例如,在windows中,您至少可以将其样式设置为外观相同。你可能会有一个很好看的网站,然后这里是一个丑陋的消息框。我同意,如果能够在对话框中设置样式会很好,但是Stackoverflow使用它,而且它从来不会冒犯我,它非常常见,对大多数用户来说都是透明的。但是,你应该知道,并不是所有会话状态提供程序都支持会话结束事件。InProc会话状态应该可以,但对于其他会话,在依赖此事件之前,您需要检查提供程序文档。这一点很好。我认为它对StateServer或SQLServer会话不起作用。仅供参考——我的javascript评论是对david评论的回应,他说“在用户离开页面之前弹出一条提示用户保存的消息”既难又难看,事实并非如此。我不是建议将其作为处理会话结束的解决方案。谢谢,我知道全局Session_End函数,我只是不确定它是否能处理超时并保存过期Session的变量。JavaScript解决方案确实非常难看。
window.onbeforeunload = closeIt;

function closeIt(){ 


  return "You have unsaved changes. Are you sure you want to leave this page?";

}