带信号器的C#文件(非代码隐藏)中的会话变量
我正在尝试使用信号器,我相当肯定我是对的。我正在做的是尝试每隔一段时间使用signarclient->server调用触发一个服务器端方法。在服务器端方法中,我有一个条件,即会话[“User”]不能为null,在该方法激发时它不可能为null,因为一旦加载该控件,它就从该控件激发。然而,在这种情况下调用该方法时,我仍然得到一个null异常 以下是C#服务器端代码:带信号器的C#文件(非代码隐藏)中的会话变量,c#,asp.net,signalr,C#,Asp.net,Signalr,我正在尝试使用信号器,我相当肯定我是对的。我正在做的是尝试每隔一段时间使用signarclient->server调用触发一个服务器端方法。在服务器端方法中,我有一个条件,即会话[“User”]不能为null,在该方法激发时它不可能为null,因为一旦加载该控件,它就从该控件激发。然而,在这种情况下调用该方法时,我仍然得到一个null异常 以下是C#服务器端代码: [HubName("timer")] public class Timer : Hub { public void Time
[HubName("timer")]
public class Timer : Hub
{
public void Time()
{
QueryFactory qFactory = new QueryFactory();
if (HttpContext.Current.Session["User"] != null)
{
var ui = (UserInfo)HttpContext.Current.Session["User"];
var userId = ui.UserID;
var userName = ui.Name;
var serverName = Dns.GetHostName();
if (!userName.Equals(""))
{
var query = qFactory.GetQuery("P_UPDATE_CURRENT_USER");
query["userid_in"] = Int32.Parse(userId);
query["last_changed_in"] = DateTime.Now;
query["server_name_in"] = serverName;
query.Execute();
}
}
}
}
以下是调用服务器端的客户端代码:
$(function () {
var hub = $.connection.timer;
if (<%=Session["User"]%> !== null) {
alert(<%=Session["User"]%>);
$.connection.hub.start().done(function() {
setInterval(function() {
hub.server.time();
}, <%=ConfigurationManager.AppSettings["timerInterval"]%>);
});
}
});
$(函数(){
var hub=$.connection.timer;
如果(!==null){
警惕();
$.connection.hub.start().done(函数()){
setInterval(函数(){
hub.server.time();
}, );
});
}
});
请注意,在客户端脚本中,我在调用服务器端方法之前发出了一个警报,该警报返回一个会话用户值,以便在调用之前知道会话是有效的。知道为什么会发生此空错误吗?您可以在代码中设置断点,以查看异常来自何处(system.diagnostics.debugger.launch()。
只要看看你的代码,唯一突出的就是var query=qFactory.GetQuery(“P_UPDATE_CURRENT_USER”);查询是否可以为空?信号器现在对会话具有只读访问权限。如果您不想这样做,您可以访问客户端中的会话,并使用查询字符串将信息传递给中心 客户端代码:
var uid = <%=Session["User"]%>;
$.connection.hub.qs = "uid=" + window.encodeURIComponent(uid)
在我看来,
signar
和Session
是完全相反的,不应该一起使用<代码>会话是每个用户的-重点是为每个用户保存不同的数据SignalR
是关于将相同的数据推送到多个用户。虽然您的观点是正确的,但这只是SignalR的一个用途。我使用它作为一种方式来检测浏览器何时不再打开以及是否以可预测的方式关闭。如果浏览器停止调用服务器端方法,则不会更新数据库中的时间戳。数据库中的此时间戳字段由数据库上运行的作业监视,该作业将从表中删除用户,从而结束锁定。我知道这是一件糟糕的事情,但我受我的客户的要求约束,所以在任何人告诉我该做什么之前,我不明白,但我无能为力。技术上是的,但代码永远不会达到这一点。它在if语句中给了我一个空错误
var userId = Context.QueryString["uid"];