我在会话超时后使用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");
}
})();
我面临的问题是:
如果有人可以在不调用Session_End()的情况下告诉我如何进行“服务器推送”,这对我有用,因为我想使用除“In Proc”之外的其他会话状态。
答案 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)
我所做的是:
syntax
$.connection.hub.qs = { "sessionId": $("#lblSessionId").text() };
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);
}