2016-10-07 24 views
3

基本上,我正在寻找一个可靠的注销机制,当用户关闭他的标签。这包括调用一些服务器代码,因此所有客户端只有机制,如删除cookie不会为我工作。ASP.NET MVC:LogOut心跳功能

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

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

我如何在ASP.NET MVC中实现这一点?我已经想到了SignalR,但它实际上不能直接访问SignalR上下文中的会话信息。

回答

1

这很容易找到一些奇特的实现(请参阅,例如,this question)。

对于基本心跳的实现则需要三个文件:HTML(网站页面发送节拍),该控制器(接收的节拍)和的JavaScript文件(与你的心跳功能)。您可以将JavaScript代码包含在HTML文件中,但最好将它分开。

这里有我的工作示例的确切内容:你需要包括JavaScript文件和jQuery

HTML文件(Heart.cshtml)

注意。 @ Url.Action(“ReceiveHeartbeat”,“Auxiliary”)给出了控制器(辅助控制器)中的方法(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请求添加更多内容(例如,成功:操作)。

function LaunchHeartBeat(actionUrl) { 
    var intervalMilliseconds = 750; 
    setInterval(function() { 
     $.ajax({ 
      type: "POST", 
      url: actionUrl 
     }); 
    }, intervalMilliseconds); 
} 

控制器(辅助控制器。CS)

[HttpPost] 
public JsonResult KeepSessionAlive() 
{ 
    // You may do stuff here 
    return new JsonResult { Data = "success" }; 
} 

编辑

var actionUrl = null; 
var intervalMilliseconds = 1000; 

function LaunchHeartBeat(myUrl) { 
    actionUrl = myUrl; 
    setInterval(HeartBeat, intervalMilliseconds); 
} 

function HeartBeat() { 
    $.ajax({ 
     type: "POST", 
     url: actionUrl 
    }); 
} 
:对JavaScript文件替代语法