4

为了设置正确的上下文,让我解释一下这个问题。直到 RC1,我们使用 GenerateConnectionIdPrefix() 来将用户 Id 前缀到连接 Id。然后我们可以随时从连接字符串中检索用户 ID。

使用 RC2,我们现在不能继承 IConnectionIdPrefixGenerator 和实现 GenerateConnectionIdPrefix 了。所以我想知道还有哪些其他途径可以使用我们的数据在集线器上设置任何属性,这些属性在连接的整个生命周期中都会持续存在。

通过文档,我意识到设置查询字符串是一种方法,但这意味着我们需要为每次调用设置它。设置往返状态可能是另一种选择,但看起来即使这样对于单个往返而不是整个生命周期都是持久的。

因此,我的最终目标是在 SignalR 连接开始时将其设置为可以在整个连接生命周期中使用的属性。

如果现在没有可用的东西,是否有计划添加支持以在下一个版本中实现类似的功能?

[更新] 如下所示,我尝试在 OnConnected 方法中设置一个状态 Clients.Caller.Userid,然后尝试在后续调用中访问它,我发现它为 null。两个呼叫都来自相同的连接 ID。

4

1 回答 1

9

查看https://github.com/SignalR/SignalR/wiki/Hubs上的“客户端和服务器之间的往返状态”部分。

基本上,您可以在 Hub 方法中读取和写入动态属性,Clients.Caller例如OnConnected客户端调用的任何内容。前任:

using System;
using System.Threading.Tasks;
using Microsoft.AspNet.SignalR;

namespace StateDemo
{
    public class MyHub : Hub
    {
        public override Task OnConnected()
        {
            Clients.Caller.UserId = Context.User.Identity.Name;
            Clients.Caller.initialized();
            return base.OnConnected();
        }

        public void Send(string data)
        {
            // Access the id property set from the client.
            string id = Clients.Caller.UserId;

            // ...
        }
    }
}

以这种方式存储的状态将在连接的整个生命周期内保持不变。

如果您想了解如何使用 SignalR JS 客户端访问此状态,请查看https://github.com/SignalR/SignalR/wiki/SignalR-JS-Client-Hubs的“往返状态”部分。

还有其他方法可以跟踪用户,而无需IConnectionIdPrefixGenerator在以下 SO 答案中讨论:SignalR 1.0 beta connection factory

于 2013-01-28T21:03:20.610 回答