会话超时后如何使用SignalR重定向?

时间:2018-02-06 06:39:08

标签: signalr session-state session-timeout

我在会话超时后使用SignalR重定向我的应用程序:

void Session_End(object sender, EventArgs e)
    {
        var HubContext = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
        HubContext.Clients.All.clientListener(false);}

我的Hub课程:

public class MyHub : Hub
{
    public void ServerListener(bool result)
    {
        Clients.Caller.ClientListener(result);
    }
}

JavaScript的:

(function () {
var myHub = $.connection.myHub;
$.connection.hub.start()
     .done(function () {
         console.log("Connected");
})
.fail(function () {
    alert("Failed!");
})

myHub.client.clientListener = function (data) {
    if (data == false)
        window.location.href = "/Home/Index";//@Url.Action("Index","Home");
}
})();

我面临的问题是:

  1. 当连接多个用户时,即使他们在不同时间登录,所有用户也会同时注销。
  2. 即使发出常规请求,也会发生注销重定向。
  3. 如果有人可以在不调用Session_End()的情况下告诉我如何进行“服务器推送”,这对我有用,因为我想使用除“In Proc”之外的其他会话状态。

2 个答案:

答案 0 :(得分:0)

关于问题#1:

由于您使用HubContext.Clients.All.clientListener所有连接到SignalR的用户确实会收到来自服务器的消息 - 当他们登录您的应用时并不重要。

您应该使用本指南从服务器向特定用户发送消息:https://docs.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/mapping-users-to-connections。 我个人喜欢单用户群体的想法https://docs.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/mapping-users-to-connections#single-user-groups

至于附加问题,只要您可以使用GlobalHost.ConnectionManager.GetHubContext<MyHub>()获取集线器引用,您只需调用注册的客户端方法来执行服务器推送(例如Clients.Group(userid).clientListener(false))。这不是必须专门在Session_End()上完成的事情。

答案 1 :(得分:0)

我所做的是:

  1. 在Page_Load上,我使用Session.SessionId更新了一个隐藏标签
  2. 在客户端上启动集线器之前,通过查询字符串传递它:
syntax
  1. 在中心OnConnected / OnReconnected的服务器端,我调用此方法来将sessionId-> connectionId的相关性存储在字典中:
    $.connection.hub.qs = { "sessionId": $("#lblSessionId").text() };
  1. 现在在Session_End中,我有以下代码(GetConnectionIdFromSessionId是我在集线器中添加的静态方法,可从#3中显示的sessionIdToConnectionId字典中读取):
private void AddConnectedClient()
{
    // read the [ASP.Net] sessionId we send from client in queryString
    string sessionId = Context.Request.QueryString["sessionId"];
    if (!string.IsNullOrEmpty(sessionId))
        sessionIdToConnectionId.AddOrUpdate(sessionId, Context.ConnectionId, (k, v) => Context.ConnectionId);
}