3

有没有办法在集线器之外获取当前的 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;

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

4

1 回答 1

0

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

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

于 2013-11-15T19:27:16.920 回答