要设置正确的上下文,让我解释一下这个问题。直到RC1,我们用来实现GenerateConnectionIdPrefix()以将用户Id添加到连接ID。然后我们可以随时从连接字符串中检索用户ID。
使用RC2,我们现在无法继承IConnectionIdPrefixGenerator&再实现GenerateConnectionIdPrefix。所以我想知道在中心使用我们的数据设置任何属性的其他途径是什么,这些属性在连接的整个生命周期中都会持续存在。
通过文档,我意识到设置查询字符串是一种方式,但这意味着我们需要为每次调用设置它。设置往返状态可能是另一种选择,但看起来即使是持续一次往返而不是整个生命周期。
所以我的最终目标是在SignalR连接开始时设置为属性,可以在整个连接生命周期中使用。
如果现在没有什么可用,是否有计划在下一版本中添加支持以实现类似的功能?
[更新] 如下所示,我试图在OnConnected方法中设置一个状态Clients.Caller.Userid,然后在后续调用中尝试访问它,我发现它为null。两个呼叫都来自相同的连接ID。
答案 0 :(得分: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;
// ...
}
}
}
以这种方式存储的状态将在连接的生命周期内保持不变。
如果您想了解如何使用SignalR JS客户端访问此状态,请查看https://github.com/SignalR/SignalR/wiki/SignalR-JS-Client-Hubs的“Round-tripping状态”部分。
还有其他方法可以跟踪以下SO回答中讨论的IConnectionIdPrefixGenerator
用户:SignalR 1.0 beta connection factory