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

Gou*_*Das 3 signalr signalr-hub

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

使用RC2,我们现在无法继承IConnectionIdPrefixGenerator并实现GenerateConnectionIdPrefix.所以我想知道可以通过我们的数据在集线器上设置任何属性的其他途径是什么,这些资源在连接的整个生命周期中都会持续存在.

通过文档,我意识到设置查询字符串是一种方式,但这意味着我们需要为每个调用设置它.设置往返状态可能是另一种选择,但看起来甚至是单个往返而不是整个生命周期.

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

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

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

hal*_*r73 8

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

基本上,您可以Clients.Caller在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;

            // ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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