在集线器之外获取SignalR用户(Hub.Context)

时间:2013-11-15 13:16:01

标签: wcf signalr signalr-hub wcf-behaviour

有没有办法让当前的signalR请求用户在集线器外面?我可以在hub方法中使用Hub.Context.User,但是如果hub方法调用任何其他底层图层? 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获取Hub,但我不确定它是当前请求的集线器,而不是并发的或新的,因为在ResolveHub结束时我看到以下代码运行

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

很明显我可以将用户从hub方法传递给wcf调用,但它需要重构从wcf行为转移到设置具有用户名的请求字段。 我也可以依靠HttpContext.Current从cookie获取信息吗?

1 个答案:

答案 0 :(得分:0)

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

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