0

我正在尝试使用 SignalR,我很确定我是对的。我正在做的是尝试使用 SignalR 客户端-> 服务器调用每隔一段时间触发服务器端方法。在服务器端方法中,我有一个条件,即 Session["User"] 不能为空,在此方法触发时它不可能为空,因为一旦加载该控件,它就会从控件中触发。但是,当在这种情况下调用该方法时,我得到一个空异常。

这是 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"]%>);
           });
       }
});

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

4

2 回答 2

1

SignalR 现在对会话具有只读访问权限。如果您不想这样做,您可以访问客户端中的会话并使用查询字符串将信息传递到集线器。

客户端代码:

var uid = <%=Session["User"]%>;
$.connection.hub.qs = "uid=" + window.encodeURIComponent(uid)

服务器端代码:

var userId = Context.QueryString["uid"];
于 2013-02-13T17:47:06.603 回答
0

您可以在代码中放置断点以查看异常来自何处(system.diagnostics.debugger.launch())。仅通过查看您的代码,唯一突出的是 var query = qFactory.GetQuery("P_UPDATE_CURRENT_USER"); 查询可以为空吗?

于 2013-01-25T20:49:21.517 回答