c# - ASP.NET MVC : LogOut Heartbeat function

标签 c# asp.net asp.net-mvc

基本上,当用户关闭他的选项卡时,我正在寻找一种可靠的注销机制。这包括调用一些服务器代码,因此所有仅客户端的机制(如删除 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/

相关文章:

html - 使用 div 中间对齐标签和文本框

c# - 如何进行转换 SQL 内部连接查询与 Entity Framework

c# - 使用 C# mono 的 WindowsAzure.Storage

c# - 如何使空网格单元格在 Asp.net 网格中可点击?

c# - ScrapySharp NavigateToPage 时继续卡住加载

c# - 饼图中的值

c# - 在输入 API 请求中发现未知属性时抛出错误?

c# - 使用 ViewModel 从多个表中获取数据?

c# - SelectSingleNode 在 foreach 上返回错误的结果

c# - 如何使用 Session.ExecuteCommand 捕获通过 WinSCP .NET 程序集执行的命令的输出