SignalR和HttpContext / Session

问题描述 投票:20回答:5

我了解SignalR为什么不给您access to the HttpContext。但是,这对我们来说是个大问题。让我解释一下:

我们的应用程序是一个多租户应用程序,用户可以在其中登录时选择环境。这基本上是将ConnectionStringName注册到HttpSession中。在SignalR集线器中,我们需要访问Disconnect上的数据库。但这是不可能的,因为此时我们还没有HttpContext并且无法确定要写入的环境。

任何人都可以向我们提出如何解决此问题的建议吗?我们对此有些卡住。

EDIT:如果您的解决方案在负载均衡的环境中工作,则可获得加分。

asp.net signalr signalr-hub
5个回答
23
投票

这是一个古老的问题,但是我留给我答案,以防万一它对那里的任何人都有用。

由于您的集线器扩展Microsoft.AspNet.SignalR.Hub,它可以访问类型为[[HubCallerContext]的Context属性。此属性公开了来自调用方的许多信息:

    ConnectionId
  • 标题
  • QueryString
  • 请求
  • Cookies
  • 用户
  • 在我的解决方案中,我使用存储在

    Context.User.Identity.Name

中的用户名作为密钥/值存储中的密钥(在我的情况下为Redis)来跟踪用户的所有连接有。您可以覆盖

OnConnnect

OnDisconnect以维护与用户关联的连接列表。您还可以存储其他所需的信息以及连接ID(根据您的情况,您的用户连接字符串)。

9
投票
Hi遇到了类似的问题,因为我需要识别未经身份验证的应用程序访问者,以个性化他们对SignalR集线器的请求。

0
投票
您可以使用诸如Dictionary之类的功能来跟踪用户连接时的ConnectionId。另外,使用SQL Server存储会话状态也可能有帮助:http://support.microsoft.com/kb/317604

0
投票
您需要您的解决方案才能在负载平衡的环境中工作这一事实强制了您需要将连接字符串存储在与Session不同的地方这一事实。键值存储(如何实现并不重要),其中键是ConnectionId(断开连接时唯一可用的信息),值是连接字符串。您可以根据需要在其他任何地方继续使用Session,但是我认为您应该将整个应用程序移到那里以进行读写操作,至少对于该信息而言。

0
投票
FYI,Signalr 3.0不再具有Context.Request对象。可以通过访问Context.Features []中的IHttpContextFeature来访问Request上下文。我使用了以下内容:
© www.soinside.com 2019 - 2024. All rights reserved.