2013-11-15 32 views
1

有什么方法可以在集线器之外获得当前signalR请求用户吗?我可以在Hub方法中使用Hub.Context.User,但是如果hub方法调用任何其他基础层? Wcf服务调用 - 额外的BehaviorExtensionElement用于添加带有当前用户标识名称的wcf消息头。在集线器外部获得SignalR用户(Hub.Context)

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; 

Obviuosly我可以从毂方法传递用户到呼叫WCF但它需要重构从WCF行为移动到明确地设定请求字段与用户名。 我也可以依靠HttpContext.Current从cookie获取信息?

回答

0

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

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

+1

感谢您的回答,但用户存储(字典)不是我想解决的问题,我现在将用户存储在couchbase中,并且没关系。我想添加身份验证信息到集线器发出的API请求,所以唯一的方法是直接传递用户信息。无论如何,我至少可以依靠cookie吗? – lavrik

相关问题