我正在尝试使用SignalR,我很确定我有权利。我正在做的是尝试使用SignalR客户端以一定间隔启动服务器端方法 - >服务器调用。在服务器端方法中,我有一个条件,即Session [“User”]不能为null,在此方法触发时它不可能为null,因为一旦加载了该控件,它就会从控件触发。但是,当在这种情况下调用该方法时,我得到一个null异常。
这是C#服务器端代码:
[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"]%>);
});
}
});
请注意,在客户端脚本中,我在调用服务器端方法之前发出警报,并且此警报返回会话用户值,因此我知道在此调用发生之前会话有效。任何想法为什么会发生这种空错误?
答案 0 :(得分:1)
SignalR现在具有对会话的只读访问权限。如果您不想这样做,您可以访问客户端中的会话并使用查询字符串将信息传递到集线器。
客户端代码:
var uid = <%=Session["User"]%>;
$.connection.hub.qs = "uid=" + window.encodeURIComponent(uid)
服务器端代码:
var userId = Context.QueryString["uid"];
答案 1 :(得分:0)
您可以在代码中放置一个断点,以查看异常的来源(system.diagnostics.debugger.launch())。 只需查看您的代码,唯一突出的是var query = qFactory.GetQuery(“P_UPDATE_CURRENT_USER”);可以查询为空吗?