使用SignalR的C#文件(不是代码隐藏)中的会话变量

时间:2013-01-25 20:31:15

标签: c# asp.net signalr

我正在尝试使用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"]%>);
           });
       }
});

请注意,在客户端脚本中,我在调用服务器端方法之前发出警报,并且此警报返回会话用户值,因此我知道在此调用发生之前会话有效。任何想法为什么会发生这种空错误?

2 个答案:

答案 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”);可以查询为空吗?