Signalr 当用户通过Web信号器集线器断开连接时,如何注销用户?

Signalr 当用户通过Web信号器集线器断开连接时,如何注销用户?,signalr,Signalr,希望大家都好。 我使用的是MVC#,AspNet.identies,并且有一个功能齐全的帐户控制器 我最近在项目中引入了一个基本的信号集线器,我想在用户断开与集线器的连接后将其注销。我的想法是从帐户控制器调用注销方法 这个中心非常简单,事实上,如果我没有弄错的话,我是从斯科特·汉斯曼的视频中拍摄的。只是hitCounter部分…现在我尝试添加logoff()功能 这是我到目前为止得到的 [HttpPost] [ValidateAntiForgeryToken] public A

希望大家都好。 我使用的是MVC#,AspNet.identies,并且有一个功能齐全的帐户控制器

我最近在项目中引入了一个基本的信号集线器,我想在用户断开与集线器的连接后将其注销。我的想法是从帐户控制器调用注销方法

这个中心非常简单,事实上,如果我没有弄错的话,我是从斯科特·汉斯曼的视频中拍摄的。只是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...
[HttpPost]
[ValidateAntiForgeryToken]
公共行动结果注销()
{
AuthenticationManager.SignOut();
返回操作(“欢迎”、“回家”);
}//这是在我的帐户控制器
[授权]
[HubName(“hitCounter”)]
公共类GameplayHub:Hub
{
私有静态int计数器=0;
公开作废记录
{
intCounter+=1;
this.Clients.All.onHitRecorded(intCounter);
}
公共覆盖System.Threading.Tasks.Task OnDisconnected(布尔停止调用)
{
Final.Controllers.AccountController obj=新的Final.Controllers.AccountController();
intCounter-=1;
this.Clients.All.onHitRecorded(intCounter);
this.Clients.Caller.onHitRecorded(obj.LogOff());
obj.LogOff();
返回基.OnDisconnected(stopCalled);
}
}//这是中心
$(函数(){
var con=$.hubConnection();
var hub=con.createHubProxy('hitCounter');
hub.on('onHitRecorded',函数(i){
$('hitCount')。文本(i);
});
con.start(函数(){
调用('recordHit');
});
})
//我的观点…只是显示了当时有多少人在活动。。。
活动人数正确显示。我想在我的应用程序中做的是,如果一个用户在两个选项卡上登录,并且他关闭了一个选项卡,那么他必须同时注销这两个选项卡


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

不幸的是,这行不通。注销用户是通过删除cookie来完成的,cookie必须由浏览器完成。SignalR在选项卡已关闭后运行断开连接的处理程序,所以您不能告诉浏览器删除cookie

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

伪代码:

在信号中心:

Task OnDisconnected()
{
  var otherTab = FindOtherTabWithUser();
  otherTab.forceLogOff();
}
在JavaScript中:

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