【问题标题】:ASP.NET MVC: LogOut Heartbeat functionASP.NET MVC:注销心跳功能
【发布时间】:2016-10-07 05:16:05
【问题描述】:

基本上,当用户关闭标签时,我正在寻找一种可靠的注销机制。这包括调用一些服务器代码,因此所有仅客户端的机制(如删除 cookie)对我不起作用。

在互联网上,您主要找到拦截window.unload 函数的方法,然后在其中放置一些代码。我知道有可能从可能触发window.unload 的其他事件中过滤掉正常的导航请求,但我通常不喜欢这种方法,因为我必须进行某种同步 AJAX 调用才能可靠地执行一些自定义服务器上的注销代码,这绝对不是实现我想要的最佳方式。

还有第二种实现心跳函数的方法来定期检查客户端是否响应。我确实认为这对我/我的场景来说是最好的方法,但我实际上正在努力使用 ASP.NET MVC 实现。

我将如何在 ASP.NET MVC 中解决这个问题?我已经想到了 SignalR,但实际上不可能直接访问 SignalR 上下文中的会话信息。

【问题讨论】:

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


    【解决方案1】:

    很容易找到一些花哨的实现(例如,参见this question)。

    对于基本的心跳实现,您将需要三个文件:HTML(发送心跳的网站页面)、controller(接收心跳)和 >JavaScript 文件(带有你的心跳功能)。您可以在 HTML 文件中包含 JavaScript 代码,但最好将其分开。

    这里有我的工作示例的确切内容:

    HTML 文件 (Heart.cshtml)

    请注意,您需要同时包含 JavaScript 文件和 jQuery。 @Url.Action("ReceiveHeartbeat", "Auxiliary") 给出控制器(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);
    }
    

    控制器(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
        });
    }
    

    【讨论】:

      猜你喜欢
      • 2015-10-29
      • 2010-10-17
      • 2020-01-21
      • 2013-05-10
      • 2010-11-11
      • 2012-05-03
      • 1970-01-01
      • 1970-01-01
      • 2015-03-31
      相关资源
      最近更新 更多