如何通过Web SignalR Hub断开用户注销?

时间:2014-08-28 06:53:19

标签: signalr

希望每个人都很好。 我正在使用MVC C#,AspNet.Identities并拥有一个功能齐全的帐户控制器。

我最近向该项目引入了一个基本的SignalR Hub,我想在用户断开连接后将用户注销。我的想法是从帐户控制器调用LogOff方法。

The Hub非常简单,事实上我是从Scott Hanselman的视频中看到的,如果我没弄错的话。只是hitCounter部分......现在我正在尝试添加logoff()功能。

这是我到目前为止所得到的。

 [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult LogOff()
    {
        AuthenticationManager.SignOut();

        return RedirectToAction("Welcome", "Home");
    }//this is in my account controller


[Authorize]
[HubName("hitCounter")]
public class GameplayHub : Hub
{
        private static int intCounter = 0;

        public void RecordHit()
        {
            intCounter += 1;
            this.Clients.All.onHitRecorded(intCounter);
        }

        public override System.Threading.Tasks.Task OnDisconnected(bool stopCalled)
        {
            Final.Controllers.AccountController obj = new Final.Controllers.AccountController();
            intCounter -= 1;
            this.Clients.All.onHitRecorded(intCounter);
            this.Clients.Caller.onHitRecorded(obj.LogOff());
            obj.LogOff();

            return base.OnDisconnected(stopCalled);

        }

}//this is the hub


<div id="hitCount" style="font-size:50px;"></div>

<script src="~/Scripts/jquery-1.6.4.js"></script>
<script src="~/Scripts/jquery.signalR-2.1.1.js"></script>
<script src="/signalr/hubs"></script>

<script>
    $(function() {
        var con=$.hubConnection();
        var hub=con.createHubProxy('hitCounter');
        hub.on('onHitRecorded', function (i) {
            $('#hitCount').text(i);
        });
        con.start(function() {
            hub.invoke('recordHit');
        });
    })
</script>//My view...just shows how many people active at that point...

活跃的人数正确显示。我在我的应用程序中尝试做的是,如果用户在2个选项卡上,并且他关闭了一个,则必须在两个选项卡上都注销。

任何帮助将不胜感激!谢谢:))

1 个答案:

答案 0 :(得分:0)

不幸的是它不会起作用。通过删除必须由浏览器完成的cookie来完成注销用户。选项卡已经关闭后,SignalR会运行已断开连接的处理程序,因此您无法告诉浏览器删除cookie。

可行的解决方案是强制重定向到用户打开的第二个标签页上的注销页面。

伪代码:

在SignalR中心:

Task OnDisconnected()
{
  var otherTab = FindOtherTabWithUser();
  otherTab.forceLogOff();
}

在JavaScript中:

forceLogOff = function() { window.location.href = '/logoff'; }