基本上,当用户关闭他的选项卡时,我正在寻找一种可靠的注销机制。这包括调用一些服务器代码,因此所有仅客户端的机制(如删除 cookie)对我来说都不起作用。
在 Internet 上,您大多会找到拦截 window.unload
函数然后在其中放置一些代码的方法。我知道有可能从其他可能触发 window.unload
的事件中过滤掉正常的导航请求,但我通常不喜欢这种方法,因为我必须进行某种同步 AJAX 调用为了在服务器上可靠地执行一些自定义注销代码,这绝对不是实现我想要的目标的最佳方式。
还有第二种实现Heartbeat函数的方法来定期检查客户端是否响应。我确实认为这对我/我的场景来说是最好的方法,但实际上我正在为 ASP.NET MVC 的实现而苦苦挣扎。
我将如何在 ASP.NET MVC 中处理这个问题?我已经想到了 SignalR,但实际上不可能直接在 SignalR 上下文中访问 session 信息。
最佳答案
很容易找到一些奇特的实现(例如,参见 this question)。
对于基本的心跳实现,您需要三个文件:HTML(发送心跳的网站页面)、 Controller (接收心跳)和JavaScript 文件(带有您的心跳功能)。您可以在 HTML 文件中包含 JavaScript 代码,但最好将其分开。
这里有我工作示例的确切内容:
HTML 文件 (Heart.cshtml)
请注意,您需要同时包含 JavaScript 文件和 jQuery。 @Url.Action("ReceiveHeartbeat", "Auxiliary") 给出 Controller (AuxiliaryController)中方法(ReceiveHeartbeat)的地址。
<head>
<script type="text/javascript" src="~/Scripts/heartBeat.js"></script>
<script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
</head>
<body>
<script type="text/javascript">
LaunchHeartBeat('@Url.Action("ReceiveHeartbeat", "Auxiliary")');
</script>
</body>
Javascript (heartBeat.js)
其他人使用 setTimeout,但如果您想要一个循环,使用 setTimeout 会更干净。我建议编写两个函数,使用 setInterval(myFunction, myInterval);(见下文)。您可以向 Ajax 请求添加更多内容(例如,success: 操作)。
function LaunchHeartBeat(actionUrl) {
var intervalMilliseconds = 750;
setInterval(function () {
$.ajax({
type: "POST",
url: actionUrl
});
}, intervalMilliseconds);
}
Controller (AuxiliaryController.cs)
[HttpPost]
public JsonResult KeepSessionAlive()
{
// You may do stuff here
return new JsonResult { Data = "success" };
}
编辑:Javascript 文件的替代语法:
var actionUrl = null;
var intervalMilliseconds = 1000;
function LaunchHeartBeat(myUrl) {
actionUrl = myUrl;
setInterval(HeartBeat, intervalMilliseconds);
}
function HeartBeat() {
$.ajax({
type: "POST",
url: actionUrl
});
}
关于c# - ASP.NET MVC : LogOut Heartbeat function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39909883/