使用 SignalR 的 C# 文件(非代码隐藏)中的会话变量
本文关键字:隐藏 会话 变量 代码 SignalR 文件 使用 | 更新日期: 2023-09-27 17:56:08
我正在尝试使用SignalR,我相当确定我是正确的。我正在做的是尝试使用 SignalR 客户端 -> 服务器调用每隔一段时间触发服务器端方法。在服务器端方法中,我有一个条件,即 Session["User"] 不得为 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"]%>);
});
}
});
请注意,在客户端脚本中,我在调用服务器端方法之前发出警报以触发,并且此警报返回会话用户值,因此我知道会话在此调用发生之前有效。知道为什么会发生此空错误吗?
SignalR 现在对会话具有只读访问权限。如果不想这样做,可以在客户端中访问会话,并使用查询字符串将信息传递到中心。
客户端代码:
var uid = <%=Session["User"]%>;
$.connection.hub.qs = "uid=" + window.encodeURIComponent(uid)
服务器端代码:
var userId = Context.QueryString["uid"];
您可以在代码中放置断点以查看异常的来源(system.diagnostics.debugger.launch())。仅通过查看您的代码,唯一突出的是 var query = qFactory.GetQuery("P_UPDATE_CURRENT_USER");查询可能为空吗?