【问题标题】:signalR maintaining user connection idssignalR 维护用户连接 ID
【发布时间】:2012-03-01 14:55:30
【问题描述】:

我正在尝试为用户维护一个连接 ID,我的意思是即使他刷新了他获得相同连接 ID 的页面

这是我现在能做的事情

javascript部分

// Start the connection            

            $.connection.hub.start(function () { chat.join(projectId, userId, userName); }).done(function () {
                alert("Connected!");
                var myClientId = $.connection.hub.id;
                setCookie("srConnectionid", myClientId, 1);

            });


            function setCookie(cName, value, exdays) {

              try{

                var exdate = new Date();
                exdate.setDate(exdate.getDate() + exdays);

                var c_value = escape(value) + ((exdays == null) ? "" : "; expires=" + exdate);
                document.cookie = cName + "=" + c_value;

              }

             catch(err){

             alert(err.Description);             

             }
       }   

然后我创建了一个像这样继承 IConnectionIdFactory 的类

  public class MyConnectionFactory : IConnectionIdFactory
  {
    public string CreateConnectionId(IRequest request)
    {
        if (request.Cookies["srconnectionid"] != null)
        {
            return request.Cookies["srconnectionid"];
        }

        return Guid.NewGuid().ToString();
    }
  }

我在Application_start()中注册了上面的类,如下

protected void Application_Start()
    {

        AspNetHost.DependencyResolver.Register(typeof(IConnectionIdFactory), () => new MyConnectionFactory());     
        AreaRegistration.RegisterAllAreas(); 
        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    }

我的问题是每次在 CreateConnectionId 中调用 MyConnectionFactory 类 request.Cookies["srconnectionid"] 每次都是空的,所以每次都会为用户分配新的连接ID。我只能找到一个帮助我维护连接ID的链接。它是http://www.kevgriffin.com/maintaining-signalr-connectionids-across-page-instances

任何人都可以建议如何解决我的问题,或者是否有任何其他方法可以为同一用户重用连接 ID...?

cookie值是在客户端设置的。我已经尝试了2天了。会很有帮助的

提前致谢

【问题讨论】:

  • 为什么要保持相同的连接ID?在我看来,如果例如用户打开另一个选项卡,这可能会导致问题。
  • 我在用户登录后将连接 ID 存储在 SQL 服务器 Db 中,然后如果我必须让该用户加入任何房间,我会从 db 获取他的连接 ID 并添加连接 ID使用 AddToGroup() 加入群组。基本上我这样做是为了让我可以轻松地将他添加到任何我可以加入的聊天室......
  • 为什么不使用其他方法,例如用户名或 cookie 信息?您甚至可以在连接状态下传输这些数据(编辑:集线器状态)。在我看来,滥用连接 ID 来表示其他一些信息(在你的情况下是用户)不是正确的做法
  • 你能否建议另一种方式更清楚一点。我不清楚
  • 如果我没有他们的连接 ID,我应该如何将他们添加到聊天室..?

标签: asp.net-mvc-3 signalr


【解决方案1】:

cookie 的过期日期应该是 UTC 字符串(您没有这样做,因此很可能服务器将您的 cookie 视为已过期)。像这样更改您的代码:

var cValue = escape(value) + ((exdays==null) ? "" : "; expires=" + exdate.toUTCString());
document.cookie = cName + "=" + cValue;

或者您可以只使用jQuery Cookie plugin 来设置cookie。

更新

此外,您提供的代码中的 cookie 名称也不一致。您正在设置名称为“userConnectionid”的 cookie,但尝试通过名称“srconnectionid”进行访问。请检查您是否没有在此处输入拼写错误。

【讨论】:

  • 添加 UTC 也无济于事
  • cookie 值已设置,但我无法在类文件中访问它,它始终为空
  • 我已经更新了我注意到的另一件事,请检查。如果它不起作用,请检查 FireBug 是否正在发送 cookie。
  • 我很抱歉混淆了。我已经进行了更正。感谢更正,它在我的代码中是正确的。还有其他想法..?
  • 请检查 FireBug 是否正在发送 cookie,并检查 Cookies 容器中的所有键以查看您有什么。从静态代码分析看来它应该可以工作,所以我们需要调试一下。
【解决方案2】:

确保设置 cookie 的路径,尤其是当页面位于子目录中时。我正在遵循类似的方法,当 cookie 路径设置为 root 时,一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多