Signalr 有没有办法在集线器上设置在连接的整个生命周期内持续存在的任何属性?

Signalr 有没有办法在集线器上设置在连接的整个生命周期内持续存在的任何属性?,signalr,signalr-hub,Signalr,Signalr Hub,为了设置正确的上下文,让我解释一下这个问题。在RC1之前,我们一直实现generateConnectionIndprefix(),将用户Id作为连接Id的前缀。然后,我们可以随时从连接字符串中检索用户Id 使用RC2,我们现在不能再继承IConnectionIdPrefixGenerator和实现GenerateConnectionIdPrefix了。所以我想知道还有什么其他途径可以使用我们的数据在集线器上设置任何属性,这些属性在连接的整个生命周期中都会持续存在 通过阅读文档,我意识到设置查询字

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

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

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

因此,我的最终目标是在signar连接上设置为property one-at-start-on-start,该连接可以在整个连接生命周期中使用

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

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

请查看上的“客户端和服务器之间的往返状态”部分

基本上,您可以在Hub方法(如
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客户端访问此状态,请参阅的“往返状态”部分


还有其他方法可以跟踪用户,而不必使用下面讨论的
IConnectionIdPrefixGenerator
,因此答案是:

我们已经维护了一些与业务逻辑相关的结构。我不想再添加任何东西来映射用户ID和连接,因为这会增加可维护性问题,我还担心设置状态的“持久性”部分。因为,在OnConnected()中,我设置了
Clients.Called.User=somename
但是当试图在随后调用的函数中提取该值时,它返回null。如果我能解决这个问题,我的问题现在就可以解决了。我现在这么说是因为我在另一个线程中读到,下一个版本将具有提取自定义数据的功能,在其他地方设置。在状态被持久化之前,必须调用客户端集线器方法。我更改了上面的示例代码,以包括对
Clients.Caller.initialized()
的调用。如果客户端在收到调用之前调用任何服务器端集线器方法,
initialized
,则在调用过程中状态将不可用。注意:在*
方法上修改
之外的状态后,不必调用方法。非常感谢,让我试试。如果我们看到它,它说“将在将来添加”. 如果我们可以从服务器/客户端同时设置期间状态,那么为什么需要添加其他内容来设置/检索自定义数据?