SignalR和HttpContext/Session

Lod*_*ijk 20 asp.net signalr signalr-hub

我理解为什么SignalR不允许你访问HttpContext.但是,这对我们来说是个问题.让我解释:

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

任何人都可以向我们提出如何解决这个问题的建议吗?我们有点卡在这一点上.

编辑:如果您的解决方案在负载平衡环境中工作,则为奖励积分.

Rac*_* R. 23

这是一个老问题,但我留下我的答案,以防它对那里的任何人都有帮助.

由于您的集线器扩展了Microsoft.AspNet.SignalR.Hub,因此它可以访问HubCallerContext类型的Context属性

此属性公开来自调用者的大量信息:

  • 的ConnectionId
  • 请求参数
  • 请求
  • 饼干
  • 用户

在我的解决方案中,我使用Context.User.Identity.Name中存储的用户名作为我的键/值存储区中的键(在我的情况下为Redis)来跟踪用户拥有的所有连接.

您可以覆盖OnConnnectOnDisconnect以维护与用户关联的连接列表.您还可以将任何其他所需内容与连接ID(您的用户连接字符串,在您的情况下)一起存储.

  • 不幸的是,如果用户打开多个会话,则基于用户名的缓存不起作用... (3认同)

JDR*_*JDR 9

您有一个类似的问题,因为我需要识别我的应用程序的未经过身份验证的访问者,以个性化他们对SignalR中心的请求.

我通过访问"HttpContext.Current.Request.AnonymousId"解决了这个问题.AnonymousId映射到SQL数据库中自实现的Session实体中的临时记录 - 实质上是模拟数据库支持的会话.

这里有一些相关的文档,以防你想自定义AnonymousId或初始化数据库条目:http://msdn.microsoft.com/en-us/library/system.web.httprequest.anonymousid.aspx

此外,您应该能够像这样访问OnDisconnected()中的Context:Context.Request.GetHttpContext().

我希望这有帮助.


小智 8

如果您使用ASP.NET核心SignalR 3.0(不是ASP.NET SignalR 2.1),那么你可以使用Context.GetHttpContext()到获取HttpContext

仅供参考,Signalr 3.0 不再具有该Context.Request对象。可以通过访问IHttpContextFeature in Context.Features[]. 我使用了以下内容:

IHttpContextFeature  hcf           = (IHttpContextFeature)this.Context.Features[typeof(IHttpContextFeature)];
HttpContext          hc            = hcf.HttpContext;
string               myCookieValue = hc.Request.Cookies["Value"];
Run Code Online (Sandbox Code Playgroud)

这可能会使用一些空检查或可能更干净,但希望这可以节省一些时间。

  • 我不在乎这个问题是否已经有7年历史了。经过近 3 个小时的来回,它救了我。 (8认同)
  • @csabinho 问题应始终使用新的最新答案进行更新 (4认同)

Ste*_*eve 0

您可以使用字典之类的东西来跟踪用户连接时的 ConnectionId。另外使用 SQL Server 存储会话状态也可能有所帮助:http://support.microsoft.com/kb/317604

SignalR 确实允许您访问 User.Identity.Name,您可以使用它来跟踪 disoconnect() 何时被触发。