获取中心外部的 SignalR 用户 (Hub.Context)



有没有办法让当前的 signalR 请求用户离开集线器?我可以在集线器方法中使用 Hub.Context.User,但是如果集线器方法调用任何其他底层?WCF 服务调用 - 附加的 BehaviorExtensionElement 用于添加具有当前用户标识名称的 wcf 消息标头。

public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
     request.Headers.Add(MessageHeader.CreateHeader(
        Constants.HeaderNames.SessionId, 
        Constants.HeaderNames.HeaderNamespace,
       _hubManager.ResolveHub(Constants.Hubs.MessengerHub).
                   Context.User.Identity.Name));
}

是的,我发现 DefaultHubManager 获取了集线器,但我不确定它会是当前请求中的集线器,而不是并发请求或新请求的中心,因为在 ResolveHub 结束时,我看到以下代码运行

   return (DependencyResolverExtensions.Resolve(this._resolver, descriptor.HubType) 
       ??  Activator.CreateInstance(descriptor.HubType)) as IHub;

显然,我可以将用户从集线器方法传递到 wcf 调用,但它需要重构才能从 wcf 行为转移到显式使用用户名设置请求字段。我也可以依靠 HttpContext.Current 从 cookie 获取信息吗?

不,你不能。 在中心本身之外检索当前活动用户的唯一方法是将用户信息传递给您在中心调用的任何方法。

一种常见的模式是通过将用户添加到 OnConnected 中的某种字典并在 OnDisconnected 中删除用户来跟踪用户。 然后,您可以采用一种完全独立的方式来识别用户,同时拥有与他们关联的所需信息。

最新更新