【问题标题】:Using the same connectionId for a client connecting to SignalR对连接到 SignalR 的客户端使用相同的 connectionId
【发布时间】:2014-08-19 08:05:40
【问题描述】:

我对 SignalR 还很陌生,但我碰壁了:我目前有一个在一台服务器上运行的 ASP.NET MVC 应用程序(用户进入并使用他们的凭据登录应用程序)和一个 SignalR 集线器,它是在使用 OWIN 和自托管的不同机器上托管的 Windows 服务中运行。我已经设法让我的网络应用程序和 SignalR 集线器一起工作,客户端正在连接到集线器,并且能够向 SignalR 发送/接收数据。

但是,我希望我的 Web 应用程序始终使用相同的 connectionId 为特定用户连接到 SignalR - 我更愿意成为 userId(或基于此的东西)。由于 SignalR 是自托管的,因此在集线器实现中可用的 Context 对象中,我无权从我的 MVC 应用程序访问用户。 据我所知,我无法从客户端(jQuery)设置 connectionId,但如果我错了,请纠正我......所以任何关于我如何实现所需行为的想法或建议将不胜感激!

【问题讨论】:

    标签: asp.net asp.net-mvc signalr owin signalr-hub


    【解决方案1】:

    无法配置自定义 connectionId。但是,可以通过 userId 与客户联系,甚至提供您自己的IUserIdProvider。只需使用Clients.User(userId).myMethod() 而不是Clients.Client(connectionId).myMethod()

    如果您不提供自己的 IUserIdProvider,则当该客户端调用 Hub 方法时,给定客户端的默认 userId 将是 Context.User.Identity.Name 的值。

    【讨论】:

    • 正如我已经提到的,我的 SignalR 在另一台机器上的 WIndows 服务中作为自托管运行。因此,在 SignalR Hub 内,Context 的 User 属性为 null,因为我无权访问 asp.net 管道。我在网上看到了有关如何实现自定义 id 提供程序的示例,但所有地方都是使用 asp.net mvc Web 应用程序托管的 SignalR 实现。
    • 用你的建议解决了这个问题。我的解决方案(现在......不确定它是否是最好的,但似乎有效)是:在 $.connection.hub.start() 方法之前的 jquery 代码中,我设置了 QueryString $.connection.hub.qs = “id=myUniqueId”;然后我实现了 IUserIdProvider,在其中我从 QueryString 获取 id 并返回它。我已经在自托管 SignalR GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider), () => new MyUserIdProvider()) 的 Startup 类中注册了这个 IUserIdProvider 实现;在集线器中,我使用 Clients.User(userId).method() ...
    • @AndreiC 只是一个问题。想象一下,如果用户 A 从不同的机器登录到应用程序,当用户 B 向用户 A 发起 ping 时,哪台机器会得到 ping?如果不是两者,那么它是如何工作的?
    • @Reddy 两台机器用户 A 登录都会得到 ping。
    • @halter73 谢谢,我知道它应该是这样工作的。但在我的情况下,它不是,所以想确认一下。我正在使用 Forms 身份验证从 signalR 进行 ping,即:我通过 Identity.Name(用户电子邮件 ID)进行 signalR ping。并且仅在最新登录的用户中接收 ping。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多